您的位置:首页 > 其它

NYOJ 115 城市平乱

2014-04-24 19:29 162 查看


城市平乱

时间限制: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


应用Dijkstra算法求解!


AC码:


#include<stdio.h>
#include<string.h>
#define INF 999999999
int G[1010][1010],visit[1010],dist[1010];
int main()
{
int T,n,m,p,q,a,b,t,min,i,j,k;
int army[105];
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&n,&m,&p,&q);

// 输入军队所在的顶点
for(i=0;i<n;i++)
scanf("%d",&army[i]);

// 初始化邻接矩阵
for(i=0;i<=m;i++)
{
for(j=0;j<=m;j++)
G[i][j]=INF;
}

// 输入可行的路径及所需时间
for(i=0;i<p;i++)
{
scanf("%d%d%d",&a,&b,&t);
G[a][b]=G[b][a]=t;   // 创建邻接矩阵
}

// Dijkstra算法求出源点q到其他各个顶点的最短路径长度
memset(visit,0,sizeof(visit));
for(i=1;i<=m;i++)
dist[i]=G[q][i];  // 初始化dist
visit[q]=1;
for(i=1;i<=m;i++)
{
min=INF;
for(j=1;j<=m;j++)
{
if(!visit[j]&&min>dist[j])
{
min=dist[j];
k=j;
}
}
visit[k]=1;
if(min==INF)
break;
for(j=1;j<=m;j++)
{
if(!visit[j]&&dist[j]>min+G[k][j])
dist[j]=min+G[k][j];
}
}

// 找出军队所在顶点到源点的最小时间
min=INF;
for(i=0;i<n;i++)
{
if(min>dist[army[i]])
min=dist[army[i]];
}
printf("%d\n",min);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: