Hdu 1874 畅通工程续(最短路:dijkstra算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874
解题思路:迪杰斯特拉模板题,枚举从s开始路上的点是否能通过其他点到另一个点的距离更短即可。
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define inf 0x33f3f3f
#define MAXN 205
int v[MAXN][MAXN];
int dist[MAXN],vis[MAXN];
int n,m,s,t;
inline void Dijkstra(){
if(s==t){
printf("0\n");
return;
}
for(int i=0;i<n;i++){//初始化为s到i的距离
dist[i]=v[s][i];
vis[i]=0;
}
dist[s]=0;
vis[s]=1;
for(int i=1;i<n;i++){
int mn=inf,ans=-1;
for(int j=0;j<n;j++){//每次找出s能走的路
if(vis[j]==0&&mn>dist[j]){
mn=dist[j];
ans=j;
}
}
if(ans==-1)break;
vis[ans]=1;//标记避免重复使用
for(int j=0;j<n;j++){//找也没有路能通过ans到j距离更短
if(vis[j]==0&&dist[j]>dist[ans]+v[ans][j]){
dist[j]=dist[ans]+v[ans][j];
}
}
}
if(dist[t]==inf){
printf("-1\n");
}else{
printf("%d\n",dist[t]);
}
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
for(int i=0;i<n;i++){//初始化
for(int j=0;j<n;j++){
if(i==j)v[i][j]=0;
else v[i][j]=inf;
}
}
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
v[a][b]=v[b][a]=v[a][b]>c?c:v[a][b];//避免两城市间有多条路影响答案
}
scanf("%d %d",&s,&t);
Dijkstra();
}
return 0;
}