POJ 1125(最短路)

如果这题不会,可能大多数跟我一样都是题难以理解的,我大致说下题意

题意:

题目大意:输入一个整数M,表示有M个股票经纪人,在接下来的M行,第i行(0<i<m)开头输入一个N,表示有N组数据,(aj,bj (1<=j<=n,))。bj表示第i号股票经纪人与aj号股票经纪人的联系时间。得出一个股票经纪人的编号,要求与其它股票经纪人联系的时间之和最短,而且得出其中联系时间最长的那个时间,并输出。

解题思路:题意很简单,解决的方法也很简单,完全是一个联系floyd算法的初级题。只需要用floyd算出每个股票经纪人与其它人的最小联系时间即可。(当然,可以通过通知甲,然后再通过甲去通知乙。)

我直接就帖代码了

#include<cstdio>
#include<cstring>
#include<iostream>
#define N 105
#define inf 10000
using namespace std;
int map[N][N];
int dis[N];
int main()
{
   int n;
   while(cin >> n,n)
   {
    for(int i=1; i<N; ++i)
       for(int e=1; e<N; ++e)
       map[i][e] =  inf;
   for(int i=1; i<=n; ++i)
   {
    int m,a,b;
    cin >> m;
    for(int e=1; e<=m; ++e)
     {cin >> a >>b;
    map[i][a] = b;
     }
   }
    for(int k=1; k<=n; ++k)
     for(int i=1; i<=n; ++i)
      for(int e=1; e<=n; ++e)
    {
      if(map[i][k]<inf&&map[k][e]<inf&&map[i][e]>map[i][k]+map[k][e])
       map[i][e] = map[i][k]+map[k][e];
    }
    int ma = 10000000,la;
    memset(dis,0,sizeof(dis));
    for(int i=1; i<=n; ++i)
     for(int e=1; e<=n; ++e)
     if(i != e)
     {
       dis[i] += map[i][e];
     }
     for(int i=1; i<=n; ++i)
     if(ma > dis[i])
     {
         la = i;
         ma = dis[i];
     }
     ma = 0;
     for(int i=1; i<=n; ++i)
       if(i != la)
     {
       if(ma < map[la][i])
        ma = map[la][i];
     }
     cout << la <<" "<<ma<<endl;
   }




    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值