畅通工程续/HDOJ 1874/最短路
题目
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
题目来源:HDOJ 1874
题目链接
解法
最短路的模板题,我用的是spfa。
代码:
#include <stdio.h>
#include <cstring>
#include <queue>
using namespace std;
int map[210][210],dis[210],n,m,a,b,c,s,t;
bool f[210];
queue <int> Q;
void spfa()
{
Q.push(s);
f[s]=true;
dis[s]=0;
while (!Q.empty())
{
int now=Q.front();
Q.pop();
f[now]=false;
for (int i=0;i<n;i++)
{
if (map[now][i]==10000000) continue;
if (dis[now]+map[now][i]<dis[i])
{
dis[i]=dis[now]+map[now][i];
if (!f[i])
{
Q.push(i);
f[i]=true;
}
}
}
}
}
int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
for (int i=0;i<n;i++) for (int j=0;j<n;j++) map[i][j]=100000000;
for (int i=0;i<n;i++) dis[i]=10000000;
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if (c<map[a][b])
map[a][b]=map[b][a]=c;
}
scanf("%d%d",&s,&t);
spfa();
if (dis[t]==10000000) printf("-1\n"); else printf("%d\n",dis[t]);
}
return 0;
}