6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10
9
此题题意也是简单明了,同样,由于数据比较弱,我们仍然采取简单粗暴的Floyd算法,但此处由于数据并不是非常弱(有点矛盾……),可能用Floyd算法会存在爆时间的危险,所以我们稍微对Floyd算法进行一下剪枝。
#include <iostream> #include <climits> using namespace std; const int maxn=1002; int T,S,D; int dis[maxn][maxn]; int s[maxn],d[maxn]; void Floyd(int max) { for(int k=1;k<=max;++k) for(int i=1;i<=max;++i) { if(dis[i][k]==INT_MAX) continue; for(int j=1;j<=max;++j) if(dis[i][k]<INT_MAX&&dis[k][j]<INT_MAX&&dis[i][k]+dis[k][j]<dis[i][j]) dis[i][j]=dis[i][k]+dis[k][j]; } } int main() { int a,b,time; int i,j,k,max; while(cin>>T>>S>>D) { max=0; for(i=1;i<maxn;++i) for(j=1;j<maxn;++j) dis[i][j]=INT_MAX; for(i=1;i<=T;++i) { cin>>a>>b>>time; if(a>max) max=a; if(b>max) max=b; if(dis[a][b]>time) dis[a][b]=dis[b][a]=time; } for(i=1;i<=S;++i) cin>>s[i]; for(i=1;i<=D;++i) cin>>d[i]; Floyd(max); int min=INT_MAX; for(i=1;i<=S;++i) for(j=1;j<=D;++j) if(dis[s[i]][d[j]]<min) min=dis[s[i]][d[j]]; cout<<min<<endl; } return 0; }