ps:我天...之前看了迪杰斯特拉..现在这题要用到floyd。。就是先建一个图,然后从列开始遍历,每列里遍历行,行又对应每列...
从A列开始遍历每行,比如遍历到B,这时候B->A知道是2,接着又遍历第一行,比如对应到C,就是B->A->C,如果B->A->C比B->C小,就把B->C更新,
感觉Floyd就是求每个点是否必须出现在某两个点之间,找出最短路径
另外这题比较坑的是,a,b之间可以有多条路......WA了几次...
代码:
#include "stdio.h" #define MAX 1000000 int map[1010][1010]; int off[1010]; int begin[1010]; int want[1010]; int T,S,D,a,b,c,time; void floyd(int t); int main(){ int i,j,k,t,min1; while(~scanf("%d%d%d",&T,&S,&D)){ t=0; for(i=1;i<=1002;i++){ for(j=1;j<=1002;j++){ map[i][j]=MAX; } } for(i=1;i<=T;i++){ scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c){ map[a][b]=c; map[b][a]=c; } if(a>t){ t=a; } if(b>t){ t=b; } } for(i=1;i<=S;i++){ scanf("%d",&begin[i]); } for(i=1;i<=D;i++){ scanf("%d",&want[i]); } floyd(t); min1=MAX; for(i=1;i<=S;i++){ for(j=1;j<=D;j++){ if(map[begin[i]][want[j]]<min1){ min1=map[begin[i]][want[j]]; } } } printf("%d\n",min1); } return 0; } void floyd(int t){ int i,j,k; for(j=1;j<=t;j++){ for(i=1;i<=t;i++){ if(map[i][j]<MAX){ for(k=1;k<=t;k++){ if(map[i][j]+map[j][k]<map[i][k]){ map[i][k]=map[i][j]+map[j][k]; } } } } } }
#include "stdio.h" #define MAX 1000000 int map[1010][1010]; int off[1010]; int begin[1010]; int want[1010]; int T,S,D,a,b,c,time; void floyd(int t); int main(){ int i,j,k,t,min1; while(~scanf("%d%d%d",&T,&S,&D)){ t=0; for(i=1;i<=1002;i++){ for(j=1;j<=1002;j++){ map[i][j]=MAX; } } for(i=1;i<=T;i++){ scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c){ map[a][b]=c; map[b][a]=c; } if(a>t){ t=a; } if(b>t){ t=b; } } for(i=1;i<=S;i++){ scanf("%d",&begin[i]); } for(i=1;i<=D;i++){ scanf("%d",&want[i]); } floyd(t); min1=MAX; for(i=1;i<=S;i++){ for(j=1;j<=D;j++){ if(map[begin[i]][want[j]]<min1){ min1=map[begin[i]][want[j]]; } } } printf("%d\n",min1); } return 0; } void floyd(int t){ int i,j,k; for(j=1;j<=t;j++){ for(i=1;i<=t;i++){ if(map[i][j]<MAX){ for(k=1;k<=t;k++){ if(map[i][j]+map[j][k]<map[i][k]){ map[i][k]=map[i][j]+map[j][k]; } } } } } }