版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Rem_little_fan_boy/article/details/81137473
畅通工程续Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 68035 Accepted Submission(s): 26240 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。 Input 本题目包含多组数据,请处理到文件结束。 Output 对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1. Sample Input 3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2 Sample Output 2 -1 |
代码:
#include <bits/stdc++.h>
const int num = 201;
const int maxn = 1e7;
int n,m;
int path[num][num],dis[num];
int vis[num];
using namespace std;
void dijkstra(int s)
{
int i,j;
memset(vis,0,sizeof(vis));
dis[s]=0; vis[s]=1; //开始时把原点的标记记为1,然后不断将新的点纳入已访问结点集合
for(i=0; i<n; ++i)
{
for(j=0; j<n; ++j)
{
if(!vis[j] && dis[s] + path[s][j] < dis[j]) //更新当前情况下所有可达点的最短路径
{
dis[j] = dis[s] + path[s][j];
}
}
int minn = maxn;
for(j=0; j<n; ++j)
{
if(!vis[j] && dis[j] < minn) //如果一个未访问的结点是目前情况下的最优选择则把它纳入已访问集合
{
minn = dis[j];
s=j;
}
}
vis[s]=1;
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0; i<n; ++i)
{
dis[i]=maxn;
for(j=0; j<n; ++j)
{
path[i][j] = maxn;
}
}
for(i=0; i<m; ++i)
{
int p,q,distance;
cin>>p>>q>>distance;
if(path[p][q]>distance) //这道题需要加入重复路径判断,不然过不了
path[p][q] = path[q][p] = distance;
}
int x,y;
cin>>x>>y;
dijkstra(x);
if(dis[y] == maxn)
cout<<"-1"<<endl;
else
cout<<dis[y]<<endl;
}
return 0;
}