标签:






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