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];
                    }
                }
            }
        }
    }
}