您的位置:首页 > 其它

HDU.1874 畅通工程续 (dijkstra)

2017-07-06 19:11 597 查看

HDU.1874 畅通工程续 (Dijkstra)

题意分析

坑点比较多

1. 某两点之间可能有多条通路,在跑Dij时需要用距离最小的算。

2. 当起点和重点相等的时候,距离为0

3. 点的编号从0开始。

代码总览

#include <bits/stdc++.h>
#define nmax 210
using namespace std;
int mp[nmax][nmax];
int dis[nmax];
bool visit[nmax];
int inf = 1e8;
int n,m;
void Dij(int s)
{
int cur = s;
memset(visit,0,sizeof(visit));
visit[cur] = true;
for(int i = 0;i<n;++i) dis[i] = inf;
dis[cur] = 0;
for(int i = 0;i<n;++i){
for(int j = 0; j<n;++j){
if(!visit[j] && dis[cur] + mp[cur][j] < dis[j])
dis[j] = dis[cur] + mp[cur][j];
}
int mini = inf;
for(int j = 0; j<n;++j){
if(!visit[j] && dis[j] < mini){
cur = j;
mini = dis[cur];

}
}
visit[cur] = true;
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d %d",&n,&m) != EOF){
memset(mp,0,sizeof(mp));
for(int i = 0; i<n;++i)
for(int j = 0;j<n;++j)
mp[i][j] = inf;
int sta,end,di;
for(int i = 0;i<m;++i){
scanf("%d %d %d",&sta,&end,&di);
int temp = mp[sta][end];
int ans = min(temp,di);
mp[end][sta] = mp[sta][end] = ans;
}
scanf("%d %d",&sta,&end);
Dij(sta);
if(sta == end){
printf("0\n");
}else if(dis[end] == inf){
printf("-1\n");
}else{
printf("%d\n",dis[end]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dijkstra