POJ1125 Stockbroker Grapevine(最短路)

题目链接

分析:

手感不错,1A。

直接穷举的起点, 求出不同起点到其它点最短路中最长的一条的最小值(好绕)。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 100+20;
const int INF = (1<<28);

int n, G[maxn][maxn], d[maxn];

int dijkstra(int s) {
    bool vis[maxn];

    memset(vis, 0, sizeof(vis));
    for(int i=0; i<n; i++) {
        d[i] = G[s][i];
    }
    d[s] = 0; vis[s] = true;

    for(int i=0; i<n-1; i++) {
        int x, m = INF;
        for(int y=0; y<n; y++) if(!vis[y] && m >= d[y]) m = d[x=y];
        vis[x] = true;
        for(int y=0; y<n; y++) if(!vis[y] && d[y] > d[x]+G[x][y]) {
            d[y] = d[x] + G[x][y];
        }
    }

    int ans = -1;
    for(int i=0; i<n; i++) {
        if(i == s) continue;
        ans = max(ans, d[i]);
    }

    return ans;
}

int main() {
    int m, v, c;

    while(scanf("%d", &n) == 1 && n != 0) {
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                G[i][j] = INF;

        for(int u=0; u<n; u++) {
            scanf("%d", &m);
            for(int i=0; i<m; i++) {
                scanf("%d %d", &v, &c);
                v--;
                G[u][v] = c;
            }
        }

        int ans = INF, k;
        for(int i=0; i<n; i++) {
            int res = dijkstra(i);
            if(res == -1) {
                ans = -1; break;
            }
            else if(ans > res) {
                ans = res;
                k = i;
            }
        }

        if(ans != INF) printf("%d %d
", k+1, ans);
        else printf("disjoint
");
    }


    return 0;
}
原文地址:https://www.cnblogs.com/tanhehe/p/3248757.html