nyoj 115 城市平乱(dijkstra)
2015-09-08 20:47
267 查看
城市平乱
描述南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。
他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。
现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱。
现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间。
![](http://acm.nyist.net/JudgeOnline/admin/kind/attached/20101122174626_27048.png)
注意,两个城市之间可能不只一条路。
输入第一行输入一个整数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
数据保证暴乱的城市是可达的。输出对于每组测试数据,输出第一支部队到达叛乱城市时的时间。每组输出占一行样例输入
1 3 8 9 8 1 2 3 1 2 1 2 3 2 1 4 2 2 5 3 3 6 2 4 7 1 5 7 3 5 8 2 6 8 2
样例输出
4
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int inf=0x3f3f3f3f; int m,n; int G[1005][1005]; bool vis[1005]; int d[1005]; void init() { memset(G,inf,sizeof(G)); memset(vis,0,sizeof(vis)); } void dijkstra(int s) { int u,i,j,v; for(i=1;i<=m;i++) d[i]=G[s][i]; d[s]=0; vis[s]=1; for(i=1;i<m;i++) { int tmp=inf; for(j=1;j<=m;j++) if(d[j]<tmp&&!vis[j]) { tmp=d[j]; u=j; } vis[u]=1; for(v=1;v<=m;v++) { if(!vis[v]&&d[u]+G[u][v]<d[v]) d[v]=d[u]+G[u][v]; } } } int main() { int t,p,q,i,u,v,w; int a[105]; scanf("%d",&t); while(t--) { init(); scanf("%d%d%d%d",&n,&m,&p,&q); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<p;i++) { scanf("%d%d%d",&u,&v,&w); G[u][v]=G[v][u]=min(G[u][v],w); } dijkstra(q); int ans=inf; for(i=0;i<n;i++) if(d[a[i]]<ans) ans=d[a[i]]; printf("%d\n",ans); } return 0; }
相关文章推荐
- Java 创建对象时的初始化过程
- 关于sql数据表中查找重复记录的技巧
- HDU4409-LCA模拟
- zabbix------key的创建
- 2014年7月华为校招机试真题3
- Servlet以及jsp异常的处理
- 奇怪的连接错误 LNK1181: 无法打开输入文件“,5.01”
- protocol buffer动态解析
- LRU算法:商品浏览历史排序
- Sum Root to Leaf Numbers
- Android中数据存储——ContentProvider存储数据
- Servlet3文件上传
- Android SQLite数据库应用之Prepared Statement、事务操作
- 网络通讯基础
- Java_jdbc 基础笔记之八 数据库连接(写一个查询Student对象的方法)
- SVN安装---本机安装(1)
- 1040. 有几个PAT(25)
- java 图的拓扑排序(利用Vector存储)
- android广播broadcast详解
- 网页中实现"分享至微博、QQ空间等"代码