余祥宣, 崔国华, 邹海明. 计算机算法基础.3版[M]. 华中科技大学出版社, 2006.
P119 算法5.10
程序的输入是一个名字为input.txt的文件,保存时注意编码格式再VS上运行的话要保存为ANSI编码,如果需要的话我可以上传一份
顶点数7 边数12 起始点1
顶点1 顶点2 权值
7 12 1
1 2 20
1 3 50
1 4 30
2 3 25
2 6 70
3 4 40
3 5 25
3 6 50
4 5 55
5 6 10
5 7 70
6 7 50
顶点数8 边数11 起始点1
顶点1 顶点2 权值
8 11 1
1 2 55
1 3 25
1 4 45
2 5 5
3 5 40
4 5 20
4 8 30
5 6 35
5 7 15
6 7 10
7 8 50
#include<iostream>
#include<fstream>
using namespace std;
#define MAX 9
#define MAXCOST 0x7fffffff/2 //设为最大值在46行整数加法溢出
int COST[MAX][MAX];
int DIST[MAX];
bool S[MAX];
int T[MAX];
void FindMinDist(int &u,int n)
{
int min = DIST[0];
for (int i = 1; i <= n; i++)
{
if (S[i] == 0 && DIST[i] < min)
{
u = i;
min = DIST[i];
}
}
}
void SHORTEST_PATHS(int v,int COST[][MAX],int DIST[],int n)
{
int u,num,i,w;
for (i = 1; i <= n; i++)
{
S[i] = 0;
DIST[i] = COST[v][i];
T[i] = v;
}
S[v] = 1;
DIST[v] = 0;
DIST[0] = MAXCOST;
for(num=2;num<=n;num++)
{
FindMinDist(u, n);
S[u] = 1;
for (i = 1; i <= n; i++)
{
if (S[i] == 0)
{
if (DIST[i] > (DIST[u] + COST[u][i]))
{
DIST[i] = DIST[u] + COST[u][i];
T[i] = u;
}
}
}
}
}
int main()
{
int i, j, k, m, n,start, cost;
ifstream in("input.txt");
in >> m >> n >> start;
for (i = 0; i <= m; i++)
{
for (j = 0; j <= m; j++)
{
COST[i][j] = MAXCOST;
}
}
for (k = 1; k <= n; k++)
{
in >> i >> j >> cost;
COST[i][j] = cost;
COST[j][i] = cost;
}
SHORTEST_PATHS(start,COST,DIST,m);
for (i = 1; i <= m; i++)
{
cout << i;
k = i;
while (k != start)
{
cout << "=>" << T[k];
k = T[k];
}
cout << " DIST=>" << DIST[i] << endl;
}
system("pause");
return 0;
}
运行结果