Hdu 2066 一个人的旅行

最短路问题    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[n];
}

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;
}





你可能感兴趣的:(Hdu 2066 一个人的旅行)