题目链接:点击打开链接
floyd算法模板题,求图中任意点到每个点的最短路,可用一path[x][y]数组记录路径
坑:按字典序排列,if(t==dis[i][j]){
if(path[i][j]>path[i][k])
path[i][j]=path[i][k];
}
使用这句。
代码:
#include <iostream> #include <cstdio> int dis[1005][1005]; int path[1005][1005]; int tax[1005]; int N,m,n; const int INF=1000000000; using namespace std; void floyd(){ for(int k=1;k<=N;k++){ for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ int t=dis[i][k]+dis[k][j]+tax[k]; if(t<dis[i][j]){ dis[i][j]=t; path[i][j]=path[i][k]; } if(t==dis[i][j]){ if(path[i][j]>path[i][k]) path[i][j]=path[i][k]; } } } } } int main() { scanf("%d",&N); while(N){ for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ scanf("%d",&dis[i][j]); if(dis[i][j]==-1) dis[i][j]=INF; path[i][j]=j; } } for(int i=1;i<=N;i++){ scanf("%d",&tax[i]); } floyd(); scanf("%d%d",&m,&n); while(m!=-1&&n!=-1){ printf("From %d to %d :\n",m,n); printf("Path: %d",m); int t=m; while(t!=n){ printf("-->%d",path[t][n]); t=path[t][n]; } printf("\nTotal cost : %d\n\n",dis[m][n]); scanf("%d%d",&m,&n); } scanf("%d",&N); } return 0; }