如果这题不会,可能大多数跟我一样都是题难以理解的,我大致说下题意
题意:
题目大意:输入一个整数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;
}