void Floyd(Mgraph c) //用佛洛依德思想求最短路徑
{
int A[11][11],path[11][11],apath[11]; //apath為存放最短路徑的中間頂點及其頂點個數
int i,j,k,a,b,m,s,d;
for(i=0;i<c.vexnum;i++)
for(j=0;j<c.vexnum;j++)
{ A[i][j]=c.arcs[i][j].adj;
if(i!=j&&c.arcs[i][j].adj<INF)
path[i][j]=i; //i到j有邊時
else
path[i][j]=-1; //i到j沒有邊時
}
for(k=0;k<c.vexnum;k++) //求i到j的最短路徑及距離
{ for(i=0;i<c.vexnum;i++)
for(j=0;j<c.vexnum;j++)
if(A[i][j]>A[i][k]+A[k][j])
{
A[i][j]=A[i][k]+A[k][j]; //修改i到j的最短路徑長度
path[i][j]=path[k][j];
}
}
printf("\n請輸入出發點(景點編號):"); //下段代碼為輸出最短路徑
scanf("%d",&a);printf("\n");
printf("請輸入目的地(景點編號):");
scanf("%d",&b);printf("\n");
if(a==b)
printf("相同的出發點和目的地!\n\n路徑為0。\n");
{ if(A[a][b]!=INF&&a!=b) //若頂點a和b之間存在路徑
{ printf("從%d到%d的路徑為:",a,b);
m=path[a][b];
d=0;apath[d]=b; //路徑上添加終點
while(m!=-1&&m!=a) //路徑上添加中間點
{ d++;apath[d]=m;
m=path[a][m];
}
d++;apath[d]=a; //路徑上添加起點
printf("(%d)%s",apath[d],c.vexs[a].name); //輸出起點
for(s=d-1;s>=0;s--) //輸出路徑上的中間頂點
printf("-->(%d)%s",apath[s],c.vexs[apath[s]].name);
printf("\n\n路徑長度為:%d\n\n",A[a][b]); //輸出頂點與頂點間的最短路徑長度
}
}
}
佛洛依德演算法中,如果出發點和目的地有兩個或以上的路徑跟長度都相等的話,怎么同時輸出啊???求解。。
uj5u.com熱心網友回復:
http://www.cnblogs.com/Braveliu/archive/2013/12/05/3459768.html轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/66046.html
標籤:基礎類
