POJ 1125 Stockbroker Grapevine



http://poj.org/problem?id=1125

最短路问题

题目大意:给出一组顶点和各顶点到达其他的直接距离,求每个点到其他点的最短距离中的最大值,然后在这些点里面最大值里面的最小值,注意这个点要是能到达其他每个点。

解题思路:floyd算法求出每对点之间的最小值,然后枚举每个顶点,就这个顶点到其他点的距离中的最大值,而且要保证这个顶点都能到达其他每个点,求这些最大值里面的最小值和相应顶点。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;

int N,G[110][110];

void Floyd(){
    for(int k=1; k<=N; k++)
        for(int i=1; i<=N; i++)
            for(int j=0; j<=N; j++){
                if(i == j)  continue;//!
                if(G[i][j] > G[i][k] + G[k][j])
                    G[i][j] = G[i][k] + G[k][j];
            }
}

int main(){
//    freopen("in.txt", "r", stdin);
    while(scanf("%d",&N) != EOF){
        if(!N)  break;
        for(int i=1; i<=N; i++){
            for(int j=1; j<=N; j++){
                G[i][j] = 1e9;
            }
            G[i][i] = 0;
        }
        int m;
        for(int i=1; i<=N; i++){
            scanf("%d",&m);
            int to,cost;
            for(int j=1; j<=m; j++){
                scanf("%d%d",&to,&cost);
                G[i][to] = min(G[i][to], cost);
            }
        }
        Floyd();
        int ans = 1e9, id = 1;
        for(int i=1; i<=N; i++){///枚举顶点
            int tmp = 0;
            for(int j=1; j<=N; j++){
                if(i == j)  continue;
                if(G[i][j] > tmp)
                    tmp = G[i][j];
            }//tmp存储的是从顶点i传完的时间
            if(tmp < ans){
                ans = tmp;
                id = i;
            }
        }
        if(ans == 1e9)  puts("disjoint");
        else    printf("%d %d\n",id, ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值