• void Dijkstra(MGraph *G,int v1,int n)
•{
•
int D2[MVNum],p2[MVNum];
•
int v,i,w,min;
•
enum boolean S[MVNum];
•
for(v=1;v<=n;v++)
•
S[v]=FALSE;
•
D2[v]=G->arcs[v1][v];
for(j=1;j<=n:j++)G->arcs[i][j]=Maxint;
•
printf("输入%d条边的i、j及w:\n",e);
•
for(k=1;k<=e;k++){
•
scanf("%d,%d,%d",&i,&j&w);
•
G->arcs[i][j]=w;
•
}printf("有向图的存储结构建立完毕!\n");
•
S[v]=TRUE;
•
for(w=1;w<=n;w++)
•
if(!S[w]&&(D2[v]+G->arcs[v][w]<D2[w])){
•
D2[w]=D2[v]+G->arcs[v][w];
•
p2[w]=v;
•
}
•}
• printf("路径长度 路径\n");
2020/12/11
7
费洛伊德算法
• (3)费洛伊德算法:
• 费洛伊德算法的思想:首先考虑路径<Vi,V1>和<V1,Vj>是否存 在。如果存在,则比较路径<Vi,Vj>和<Vi,V1,Vj>的路径长度, 取长度较短者为当前所求的最短路径。然后考虑从Vi到Vj是否含 有顶点V2为中间顶点的路径<Vi,…,V2…,Vj>,若没有,则其 最短路径为之前所求,若有,则<Vi,…,V2…,Vj>可以分解为 <Vi,…V2>和<V2,…,Vj>,而其为前一次找到的中间顶点序号不 大于一的最短路径,将两者相加记为路径长度,比较该长度与前 一次的中间顶点序号不大于一的,取其最短的作为当前求的从Vi 到Vj的中间顶点长度不大于二的最短路径,直到选出不大于N的 最短路径为止。