// Experiment 3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<fstream>
using namespace::std;
#define N 50
#define Max 10000
int matrix[N][N];
int n;
void ShowPath(int p[N], int i, int a) {
if (i != a)
{
if (p[i] != a&&p[i] != 99)
{
ShowPath(p, p[i], a);
cout << p[i] << "-->";
}
}
}
void Show2(int dis[],int a,int path[]) {
for (int i = 0; i < n; i++)
{
if (i != a&&dis[i] != 0 && dis[i] != Max) {
cout << a << "-->";
ShowPath(path, i, a);
cout << i << " " << dis[i] << endl;
}
else if(i!=a)
cout << a << "-->" << i << " " << "NULL" << endl;
}
}
void Min(int a) {
int dis[N] = { 0 };
int newId=a;
int newdis=0;
int mark[N] = { 0 };
int k;
int path[N];
for (int l = 0; l < N; l++)
{
path[l] = 99;
}
for (int i = 0; i < n; i++)
{
dis[i] = matrix[a][i];
}
mark[a] = 1;
for (int i = 0; i < n-1 ; i++)
{
k = 0;
newdis = Max;
for (int j = 0; j < n; j++)
{
if (mark[j] != 1 && dis[j] != 0)
{
if (newdis > dis[j])
{
newdis = dis[j];
newId = j;
}
}
}
if (newdis != Max) {
dis[newId] = newdis;
mark[newId] = 1;
}
if (i == 0)
{
path[newId] = a;
}
int temp;
for (; k < n; k++)
{
temp = dis[k];
if (mark[k]!= 1&&matrix[newId][k]!=0)
{
if (dis[k] != 0)
{
dis[k] = dis[k] < (dis[newId] + matrix[newId][k]) ? dis[k] : (dis[newId] + matrix[newId][k]);
}
else
{
dis[k] = dis[newId] + matrix[newId][k];
}
if (dis[k] != temp)
{
path[k] = newId;
}
}
}
}
Show2(dis,a,path);
}
int main()
{
ifstream in;
in.open("C:\\Users\\asus\\Documents\\Visual Studio 2017\\Projects\\Experiment 3\\input.txt");
if (in.fail())
{
cout << "ERROR!";
}
in >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
in>>matrix[i][j] ;
}
}
int a;
cout << "Input start point:" << endl;
cin >> a;
while (a<n&&a>=0)
{
Min(a);
cout << "Input start point:" << endl;
cin >> a;
}
return 0;
}
单源最短路径
最新推荐文章于 2025-05-02 18:58:24 发布