Illustration of Shortest Path Algorithm, and a sample problem from PTA
Problem
Introduction
Write a program to find the weighted shortest distances from any vertex to a given source vertex in a digraph. If there is more than one minimum path from v to w, a path with the fewest number of edges is chosen. It is guaranteed that all the weights are positive and such a path is unique for any vertex.
Format of functions:
1
voidShortestDist( MGraph Graph, int dist[], int path[], Vertex S );
where MGraph is defined as the following:
1 2 3 4 5 6 7
typedefstructGNode *PtrToGNode; structGNode{ int Nv; int Ne; WeightType G[MaxVertexNum][MaxVertexNum]; }; typedef PtrToGNode MGraph;
The shortest distance from V to the source S is supposed to be stored in dist[V]. If V cannot be reached from S, store -1 instead. If W is the vertex being visited right before V along the shortest path from Sto V, then path[V]=W. If V cannot be reached from S, path[V]=-1, and we have path[S]=-1.
typedefenum {false, true} bool; #define INFINITY 1000000 #define MaxVertexNum 10 /* maximum number of vertices */ typedefint Vertex; /* vertices are numbered from 0 to MaxVertexNum-1 */ typedefint WeightType;
typedefstructGNode *PtrToGNode; structGNode{ int Nv; int Ne; WeightType G[MaxVertexNum][MaxVertexNum]; }; typedef PtrToGNode MGraph;
MGraph ReadG(); /* details omitted */
voidShortestDist( MGraph Graph, int dist[], int path[], Vertex S );
intmain() { int dist[MaxVertexNum], path[MaxVertexNum]; Vertex S, V; MGraph G = ReadG();
scanf("%d", &S); ShortestDist( G, dist, path, S );
for ( V=0; V<G->Nv; V++ ) printf("%d ", dist[V]); printf("\n"); for ( V=0; V<G->Nv; V++ ) printf("%d ", path[V]); printf("\n");
voidShortestDist(MGraph Graph, int dist[], int path[], Vertex S) { // 定义 int i; int known[MaxVertexNum]; // 记录是否遍历的数组 int pathlength[MaxVertexNum]; // 记录路径长度的数组
while (1) { int min = INFINITY; int v = -1; // 寻找距离最小的点以及路径最短的点 // v = smallest unknown distence vertex for (i = 0; i < Graph->Nv; i++) { if(known[i] == 0) if (dist[i] < min) { min = dist[i]; v = i; }
} // 遍历结束未找到,跳出 if (v == -1) break;
known[v] = 1; // 遍历v连接点,若distv+weight更短则进行更新
for (i = 0; i < Graph->Nv; i++) { if (known[i] == 0 && dist[v] + Graph->G[v][i] < dist[i]) { dist[i] = dist[v] + Graph->G[v][i]; path[i] = v; } } } // 按照题目需求,将不连结的vertex输出-1 for (i = 0; i < Graph->Nv; i++) { if (dist[i] == INFINITY) { dist[i] = -1; path[i] = -1; } } }