大致题意:
有n个人,第i个人可以给a[i]个人发消息,给每个人发送消息也有相应的时间。一个人给剩下的n-1个人发送消息的总时间定义为给每个人发送消息的时间的最大值。现在问你,应该从哪个人开始发消息使得总时间最少。
大致思路:
floyd模版题,我们求出n个源点所有的最短路,如果有一个源点到不了剩下的所有点,那么代表此路不通。
每次枚举一个源点,求出源点到其他点的最短路的最大值。
最后求出最小值,就是答案。
代码:
#include<stdio.h>
#include<iostream>
using namespace std;
#define inf 99999999
int dis[105][105];
int n;
void 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];
}
}
}
}
return;
}
int main()
{
while(~scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)dis[i][j]=0;
else
dis[i][j]=inf;
}
}
int num,peo,time;
for(int i=1;i<=n;i++)
{
scanf("%d",&num);
for(int j=1;j<=num;j++)
{
scanf("%d%d",&peo,&time);
dis[i][peo]=time;
}
}
Floyd();
int minl=inf;
int flag=0;
int lab;
int ans;
int j;
for(int i=1;i<=n;i++)
{
ans=-1;
for(j=1;j<=n;j++)
{
if(dis[i][j]==inf)
{
flag++;
break;
}
ans=max(ans,dis[i][j]);
}
if(j==n+1&&minl>ans)
{
minl=ans;
lab=i;
}
}
if(flag==n)
{
printf("disjoint\n");
}
else
{
printf("%d %d\n",lab,minl);
}
}
}