http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=115
#include <iostream>
#include <cstring>
using namespace std;
const int inf=0x3f3f3f3f;
int map[1005][1005];
int dis[1005];
int vis[1005];
int kk[1005];
int main(){
int T;
cin>>T;
while(T--){
int n,m,p,q,a,b,c;
cin>>n>>m>>p>>q;
memset(map,inf,sizeof(map));
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
if(i==j) map[i][j]=0;
else map[i][j]=inf;
}
}
for(int i=1;i<=n;i++) cin>>kk[i];
for(int i=0;i<p;i++){
cin>>a>>b>>c;
map[a][b]=c;
map[b][a]=c;
}
for(int i=1;i<=m;i++)
dis[i]=map[q][i];
vis[q]=1;
for(int i=1;i<=m-1;i++){
int min=inf,z;
for(int j=1;j<=m;j++){
if(!vis[j]&&dis[j]<min){
z=j;
min=dis[j];
}
}
vis[z]=1;
for(int k=1;k<=m;k++){
if(dis[z]+map[z][k]<dis[k]&&map[z][k]<inf)
dis[k]=dis[z]+map[z][k];
}
}
int minn=inf;
for(int i=1;i<=n;i++){
if(dis[kk[i]]<minn) minn=dis[kk[i]];
}
cout<<minn<<endl;
}
}
1376

被折叠的 条评论
为什么被折叠?



