POJ 1125 Stockbroker Grapevine (Floyd)

题目大意

  • 给出n个经纪人,接下来的n行,每行的第一个数m代表该经纪人的朋友数。紧接着有m对数,第一数代表朋友编号,第二个表示将消息传给该朋友所需时间。
  • 求从某个人开始,将消息传送到所有人所需花费的最少时间。
  • 若消息不能传送到每一个人,则输出disjoint。

分析

  • 很明显,要求出任意两点的最短路径,用Floyd算法。
  • 然后遍历结果数组dis,求出每一行的最大值的最小值即可。

代码

#include <iostream>

using namespace std;
#define INF 0x3fffffff
const int maxn = 110;

int dis[maxn][maxn];
int main()
{
    int n;
    while(cin >> n && n)
    {
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++) dis[i][j] = (i == j ? 0 : INF);
        for(int i = 1; i <= n; i++) {
            int m; cin >> m;
            for(int j = 0; j < m; j++) {
                int x , y; cin >> x >> y;
                dis[i][x] = y;
            }
        }

        //floyd
        for(int k = 1; k <= n; k++)
        {
            for(int i = 1; i <= n; i++)
                for(int j = 1; j <= n; j++)
                    if(dis[i][j] > dis[i][k] + dis[k][j])
                        dis[i][j] = dis[i][k] + dis[k][j];
        }
        /*
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) cout << dis[i][j] << "  ";
            cout << endl;
        }
        */
        int pos , ans = INF;
        for(int i = 1; i <= n; i++) {
            int tmp = 0;
            for(int j = 1; j <= n; j++) tmp = max(tmp , dis[i][j]);
            if(ans > tmp) {ans = tmp; pos = i;}
        }
        if(ans == INF) cout << "disjoint" << endl;
        else cout << pos << " " << ans << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值