nyoj 115 城市平乱
2016-03-04 23:04
246 查看
城市平乱
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
南将军统领着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
数据保证暴乱的城市是可达的。
输出
对于每组测试数据,输出第一支部队到达叛乱城市时的时间。每组输出占一行
样例输入
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<queue>
#include<algorithm>
using namespace std;
int n,m,p,q;
int s,a,b,c;
bool bing[1050];
int cmp[1050][1050];
int chang[1050];
void lu(int qq)
{
bool guo[1050];
memset(guo,true,sizeof(guo));
for (int i=1;i<=m;i++)
{
chang[i]=cmp[i][qq];
}
guo[qq]=false;
int kk,mi;
for (int j=1;j<m;j++)
{
mi=0x3f3f3f;
for (int i=1;i<=m;i++)
if (guo[i]&&chang[i]<mi)
{
mi=chang[i];
kk=i;
}
guo[kk]=false;
if (bing[kk])
{
s=chang[kk];
break;
}
for (int i=1;i<=m;i++)
if (guo[i]&&chang[i]>chang[kk]+cmp[i][kk])
chang[i]=mi+cmp[i][kk];
}
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
memset(bing,false,sizeof(bing));
memset(cmp,0x3f3f3f,sizeof(cmp));
scanf("%d%d%d%d",&n,&m,&p,&q);
for (int i=0;i<n;i++)
{
scanf("%d",&s);
bing[s]=true;
}
for (int i=0;i<p;i++)
{
scanf("%d%d%d",&a,&b,&c);
cmp[a][b]=cmp[b][a]=min(cmp[a][b],c);
}
lu(q);
printf("%d\n",s);
}
return 0;
}
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
南将军统领着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
数据保证暴乱的城市是可达的。
输出
对于每组测试数据,输出第一支部队到达叛乱城市时的时间。每组输出占一行
样例输入
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<queue>
#include<algorithm>
using namespace std;
int n,m,p,q;
int s,a,b,c;
bool bing[1050];
int cmp[1050][1050];
int chang[1050];
void lu(int qq)
{
bool guo[1050];
memset(guo,true,sizeof(guo));
for (int i=1;i<=m;i++)
{
chang[i]=cmp[i][qq];
}
guo[qq]=false;
int kk,mi;
for (int j=1;j<m;j++)
{
mi=0x3f3f3f;
for (int i=1;i<=m;i++)
if (guo[i]&&chang[i]<mi)
{
mi=chang[i];
kk=i;
}
guo[kk]=false;
if (bing[kk])
{
s=chang[kk];
break;
}
for (int i=1;i<=m;i++)
if (guo[i]&&chang[i]>chang[kk]+cmp[i][kk])
chang[i]=mi+cmp[i][kk];
}
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
memset(bing,false,sizeof(bing));
memset(cmp,0x3f3f3f,sizeof(cmp));
scanf("%d%d%d%d",&n,&m,&p,&q);
for (int i=0;i<n;i++)
{
scanf("%d",&s);
bing[s]=true;
}
for (int i=0;i<p;i++)
{
scanf("%d%d%d",&a,&b,&c);
cmp[a][b]=cmp[b][a]=min(cmp[a][b],c);
}
lu(q);
printf("%d\n",s);
}
return 0;
}
相关文章推荐
- 一些Android经验
- struts2日常
- ng-repeat 嵌套 ng-switch 出错解决
- 学习linux决心书
- poj2532(BIT)
- AndroidStudio检测不到手机设备
- [SSH 3]以网上商城项目浅谈spring配置
- [SSH 3]以网上商城项目浅谈spring配置
- Python Tools for Visual Studio
- python 遍历目录下所有文件
- SWIG and Android
- Binarysearch 二分查找
- iOS使用AVCaptureSession自定义相机
- Codeforces Round #344 (Div. 2) E. Product Sum 维护凸壳
- VS2010中的快捷键
- SpringMVC 文件上传配置,多文件上传,使用的MultipartFile
- ubuntu下安装windows adobeflash播放器插件
- Hust oj 2038 联系网络(MST)
- listagg
- mysql undo redo log在事务中起的作用