题目链接

分析:

手感不错,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\n", k+1, ans);
        else printf("disjoint\n");
    }


    return 0;
}

 

相关文章:

  • 2022-01-25
  • 2021-12-26
  • 2021-11-20
  • 2021-10-18
  • 2022-12-23
  • 2022-12-23
  • 2021-07-13
  • 2021-11-26
猜你喜欢
  • 2021-06-12
  • 2021-08-15
  • 2021-11-16
  • 2021-08-01
相关资源
相似解决方案