nyoj 115 城市平乱(spfa)
来源:互联网 发布:windows播放器下载 编辑:程序博客网 时间:2024/05/17 06:54
将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。
他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。
现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱。
现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间。
注意,两个城市之间可能不只一条路。
- 输入
- 第一行输入一个整数T,表示测试数据的组数。(T<20)
每组测试数据的第一行是四个整数N,M,P,Q(1<=N<=100,N<=M<=1000,M-1<=P<=100000)其中N表示部队数,M表示城市数,P表示城市之间的路的条数,Q表示发生暴乱的城市编号。
随后的一行是N个整数,表示部队所在城市的编号。
再之后的P行,每行有三个正整数,a,b,t(1<=a,b<=M,1<=t<=100),表示a,b之间的路如果行军需要用时为t
数据保证暴乱的城市是可达的。 - 输出
- 对于每组测试数据,输出第一支部队到达叛乱城市时的时间。每组输出占一行
- 样例输入
13 8 9 81 2 31 2 12 3 21 4 22 5 33 6 24 7 15 7 35 8 26 8 2
- 样例输出
4
思路:从暴乱点用spfa跑一遍,比较每个军队的距离,找个最小的
#include<iostream>#include<cstdio>#include<functional>#include<queue>#include<cstring>using namespace std;#define INF 999999999int Map[1005][1005];int dis[1005],book[1005];//book标记的是这个点在不在队列里int n,m;int init(){ int i,j; for(i=1;i<=m;i++){ for(j=1;j<=m;j++) Map[i][j]=INF; dis[i]=INF; }}void spfa(int st){ queue<int>q; while(!q.empty()) q.pop(); int i,j; i=st; dis[i]=0; book[i]=1; q.push(i); while(!q.empty()){ i=q.front(); q.pop(); book[i]=0;//已经出队列的点不标记 // printf("i=%d dis=%d\n",i,dis[i]); for(j=1; j<=m; j++) { if(Map[i][j]!=INF ) { if(dis[j]>Map[i][j]+dis[i]) {//更新值 dis[j]=Map[i][j]+dis[i]; if(book[j]==0){ q.push(j); book[j]=1; } // printf("dis[%d]=%d\n",j,dis[j]); } } } }}int main(){ int t,p,q; int ar[105]; int i,j; int a,b,c; scanf("%d",&t); while(t--){ scanf("%d%d%d%d",&n,&m,&p,&q); init();//初始化 // printf("n=%d m=%d p=%d q=%d\n",n,m,p,q); for(i=0;i<n;i++) scanf("%d",&ar[i]); /* for(i=0;i<n;i++) printf("%d ",ar[i]);。。军队所在的城市编号 printf("\n");*/ while(p--){ scanf("%d%d%d",&a,&b,&c); if(c<Map[a][b]){ Map[a][b]=c; Map[b][a]=c; } } /* for(i=1;i<=m;i++){ for(j=1;j<=m;j++){ printf("%d ",Map[i][j]); } printf("\n"); }*/ memset(book,0,sizeof(book)); spfa(q); int ans=INF; /* for(i=1;i<=m;i++) printf("%d ",dis[i]); printf("\n"); */ for(i=0;i<n;i++){ if(dis[ar[i]]<ans) ans=dis[ar[i]]; } printf("%d\n",ans); } return 0;}
0 0
- NYOJ-115 城市平乱 SPFA
- nyoj 115 城市平乱(spfa)
- nyoj 115 城市平乱
- nyoj-115-城市平乱
- nyoj 115 城市平乱
- NYOJ 115 城市平乱
- NYOJ 115 城市平乱
- NYOJ-115 城市平乱
- nyoj 115 城市平乱
- NYOJ 115 城市平乱
- nyoj 115 城市平乱
- nyoj 115 城市平乱
- nyoj 115 城市平乱
- NYOJ 115 城市平乱
- NYOJ 115 城市平乱
- NYOJ 115 城市平乱
- NYOJ-115 城市平乱
- NYOJ 115-城市平乱
- c++实验四-星号输出图
- assert()用法
- Codeforces Round #408 (Div. 2) C. Bank Hacking
- MATLAB 视频与图像转换
- 资源整理
- nyoj 115 城市平乱(spfa)
- 拦截导弹 dp java
- Linux信号1
- socket网络编程
- 在编译android4.4的时候libwebviewchromium.so时停止很长时间发生错误
- LinuxC编程之IO-通过lseek对文件进行读写
- 最长回文子串(Manacher算法)
- 深度学习中momentum的作用
- c++第四次作业