NYOJ 115 城市平乱(Dijkstra入门)
原创
©著作权归作者所有:来自51CTO博客作者herongwei的原创作品,请联系作者获取转载授权,否则将追究法律责任
链接:click here
题意:
南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱。现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间。
思路:最短路问题入门题:出的数据比较水,看到别人都是用优先队列的Dijkstra实现, 效率提高不少。最短路问题练习太少,这题还是给了一点自信,先这样吧。
参考代码:
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int Inf=0x3f3f3f3f;
const int maxn=1010;
int cost[maxn][maxn]; //存图
int d[maxn]; //从s出发的最短路径
bool used[maxn]; //已经使用过的图
int V; //顶点数
int city[maxn];
void dijkstra(int s)
{
for(int i=0; i<V; i++)
d[i]=cost[s][i];
memset(used,false,sizeof(used));
d[s]=0; //自身权值为0
used[s]=true;
while(true)
{
int v=-1;
for(int u=0; u<V; u++)
{
if(!used[u]&&(v==-1||d[u]<d[v]))
v=u;
}
if(v==-1) break;
used[v]=true;
for(int u=0; u<V; u++)
d[u]=min(d[u],d[v]+cost[v][u]);
}
//return d[V];
}
int main()
{
int ncase,N,P,Q,i,j;
scanf("%d",&ncase);
while(ncase--)
{
int u,v,quan;
memset(cost,Inf,sizeof(cost));
scanf("%d%d%d%d",&N,&V,&P,&Q);
for(i=0; i<N; i++)
scanf("%d",&city[i]);
for(i=0; i<P; i++)
{
scanf("%d%d%d",&u,&v,&quan);
if(cost[u][v]>quan)
cost[u][v]=cost[v][u]=quan;
}
int temp=Inf;
dijkstra(Q);
for(i=0; i<N; i++)
{
if(temp>d[city[i]])
temp=d[city[i]];
}
printf("%d\n",temp);
}
return 0;
}