hdu 1385 题意 测试数据
题意:两点间的最短距离,并输出路径(按字典序排列),如何理解字典序,如:1>4>5>6的值等于1>2>5>6的值而且都为最短路径,
此时必须输出:1>2>5>6
解法:floyd
ac代码:
View Code
#include<iostream> using namespace std; const int INT=0x7fffff; const int M=1000+99; int map[M][M];//存地图 int d[M];//存每一个点的税金 int path[M][M];//记录点i->j经过的点 int n; void floyd() { int i,j,k; for(i=1;i<=n;i++) for(j=1;j<=n;j++) path[i][j]=j; for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(map[i][k]+map[k][j]+d[k]<map[i][j])//松弛操作 { map[i][j]=map[i][k]+map[k][j]+d[k]; path[i][j]=path[i][k]; } else if(map[i][k]+map[k][j]+d[k]==map[i][j])//按字典排序的关键 { if(path[i][j]>path[i][k]) path[i][j]=path[i][k]; } } } } } int main() { while(cin>>n,n) { memset(map,0,sizeof(map)); memset(d,0,sizeof(d)); int i,j; int a,b; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { cin>>a; if(a!=-1) map[i][j]=a; else map[i][j]=INT; } } for(i=1;i<=n;i++) cin>>d[i]; floyd();//调用floyd函数 while(cin>>a>>b,!(a==-1&&b==-1)) { printf("From %d to %d :\nPath: ",a,b); if(a==b) //当自己访问自己时经过的点只需输出自己 cout<<a<<endl; else { int x=a,y=b; int c=x; cout<<a<<"-->"; while(path[x][y]!=y)//输出经过的每一个点 { cout<<path[x][y]<<"-->"; x=path[x][y]; } cout<<b<<endl; } printf("Total cost : %d\n",map[a][b]);//此时的任意一个map[][]都存储了,任意点i->j的最短路径 cout<<endl; } } return 0; } /* 5 0 3 22 -1 4 3 0 5 -1 -1 22 5 0 9 20 -1 -1 9 0 4 4 -1 20 4 0 5 17 8 3 1 1 3 3 5 2 4 1 1 -1 -1 */