您的位置:首页 > 其它

NYOJ 115 城市平乱

2014-07-19 21:13 232 查看

[b]城市平乱[/b]

时间限制:1000ms|内存限制:65535KB
难度:4

[b]描述[/b]
南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。

他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。

现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱。

现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<climits>
usingnamespacestd;
constintINF=INT_MAX>>2;
structarc{
intto,w;
};
vector<arc>e[1005];
intn,m,p,q,b[105];
boolused[1005];
intd[1005];
voidspfa(intsrc){
inti,j,temp;
memset(used,false,sizeof(used));
queue<int>qu;
for(i=0;i<=m;i++)d[i]=INF;
d[src]=0;
used[src]=true;
qu.push(src);
while(!qu.empty()){
temp=qu.front();
used[temp]=false;
qu.pop();
for(i=0;i<e[temp].size();i++){
j=e[temp][i].to;
if(d[j]>d[temp]+e[temp][i].w){
d[j]=d[temp]+e[temp][i].w;
if(!used[j]){
used[j]=true;
qu.push(j);
}
}
}
}
}
intmain(){
intks,i,j,u,v,w;
scanf("%d",&ks);
while(ks--){
scanf("%d%d%d%d",&n,&m,&p,&q);
for(i=0;i<1005;i++)
e[i].clear();
for(i=0;i<n;i++)
scanf("%d",b+i);
for(i=0;i<p;i++){
scanf("%d%d%d",&u,&v,&w);
e[u].push_back((arc){v,w});
e[v].push_back((arc){u,w});
}
spfa(q);
intans=d[b[0]];
for(i=1;i<n;i++)
if(ans>d[b[i]])ans=d[b[i]];
printf("%d\n",ans);
}
return0;
}


ViewCode



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: