标签:
int ShortPath(MGraph G,int v0,PathMatrix &P,ShortPathTable &D) { //用戴克斯特拉算法求有向图G中v0顶点到其余顶点v的最短路径P[v]及带权长度D[v]。 //若P[v][w]为TRUE,则w是从v0到v当前求得最短路径上的顶点。 //final[v]为TRUE当且仅当v∈S,即已经求得从v0到v的最短路径。 for(v = 0;v < G.vexmun;v++) { final[v] = FALSE; D[v] = G.WeiArcs[v0][v]; for(w = 0;w < G.vexnum;w++) P[v][w] = FALSE; //设空路径 if(D[v] < INFINITY) { p[v][v0] = TRUE; p[v][v] = TRUE; } } D[v0] = 0;final[v0] = TRUE; //初始化,v0顶点属于S集合 //開始主循环,每次求得v0到某个顶点v的最短路径,并将v加到S集合中 for(i = 1; i < G.vexnum; i++) //其余G.vexnum - 1个顶点 { min = INFINITY; //当前所知离v0点的近期距离 for(w = 0;w < G.vexnum; i++) { if(!final[w]) //w顶点在V - S中 { if(D[w] < min) //w顶点离v0更近 { v = w; min = D[w]; } } } final[v] = TRUE; //离v0顶点近期的v增加到S中 for(w = 0;w < G.vexnum;w++) //更新当前最算路径及距离 { if(!final[w] && (min + G.WeiArcs < D[w])) { D[w] = min + G.WeiArcs[v][w]; //p[w] = P[v] + P[w]; P[w] = P[v]; P[w][w] = TRUE; } } } return 0; }ok,Dijkstra algorithm介绍完了。
int ShortPath(MGraph G,int v0,PathMatrix &P,ShortPathTable &D) { //用Floyd算法求有向图中各对顶点v和w之间的最短路径P[v][w]及其带权长度D[v][w]。 //若p[v][w][u]为TRUE,则u是从v到w当前求得的最短路径上的顶点 for(v = 0;v < G.vexnum;v++) for(w = 0;w < G.vexnum;w++) { D[v][w] = G.arcs[v][w]; if(D[v][w] < INFINITY) //从v到w有直接路径 { P[v][w][u] = TRUE; P[v][w][w] = TRUE; } } for(u = 0;u < G.vexnum;u++) for(v = 0;v < G.vexnum;v++) for(w = 0;w < G.vexnum;w++) { if(D[v][u] + D[u][w] < D[v][w]) //从v经u到w的一条更短路径 D[v][w] = D[v][u] < D[u][w]; for(i = 0;i < G.vexnum;i++) P[v][w][i] = P[v][u][i] || P[u][w][i]; } return 0; }
标签:
原文地址:http://www.cnblogs.com/bhlsheji/p/4341488.html