您的位置:首页 > 其它

Hdu 2066 一个人的旅行

2013-08-23 15:06 260 查看
最短路问题    Dijkstra

分析:

1)本题的起始点和终点不唯一。假设有一点起始点离全部的相邻城市的距离都是1,有一点终点离全部的想要去的目的地的距离也都是1,则将Dijkstra出来的值减2即可。

2)两个城市之间的路不唯一,可有多条路,所以在输入的时候做一下判断,选取最小的。

AC代码:

#include <cstdio>
#include <cstring>
using namespace std;

#define MAXN 1010
#define INF 0x3fffffff
int s[MAXN],dist[MAXN],map[MAXN][MAXN];
int T,S,D;

int max(int x, int y) {
if(x < y) return y;
else return x;
}

int Dijkstra(int n) {
int i,j;
memset(s, 0, sizeof(s));
for(i=0; i<=n; i++)
dist[i] = map[0][i];
s[0] = 1;
dist[0] = 0;
for(i=0; i<n; i++) {
int min = INF;
int u;
for(j=0; j<=n; j++) {
if(!s[j] && dist[j]<min) {
min = dist[j];
u = j;
}
}
s[u] = 1;
for(j=0; j<=n; j++) {
if(!s[j] && dist[j]>map[u][j]+dist[u])
dist[j] = map[u][j] + dist[u];
}
}
return dist
;
}

int main() {
int i,j;
while(scanf("%d%d%d",&T,&S,&D)!=EOF) {
int ss[MAXN],ee[MAXN];
int a,b,_time;
int end = 0;
for(i=0; i<MAXN; i++)
for(j=0; j<MAXN; j++) {
map[i][j] = map[j][i] = INF;
}
for(i=0; i<T; i++) {
scanf("%d%d%d",&a,&b,&_time);
if(map[a][b] == INF) {
map[a][b] = map[b][a] = _time;
}
else if(_time < map[a][b]) {
map[a][b] = map[b][a] = _time;
}
if(end < max(a, b)) {
end = max(a, b);
}
}
for(i=0; i<S; i++) {
scanf("%d",&ss[i]);
map[0][ss[i]] = map[ss[i]][0] = 1;
}
end++;
for(i=0; i<D; i++) {
scanf("%d",&ee[i]);
map[end][ee[i]] = map[ee[i]][end] = 1;
}
int ans = Dijkstra(end)-2;
printf("%d\n", ans);
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: