题目大意:n个朋友之间相互传播谣言需要时间,给你每个人有哪几个朋友,传播到那些朋友需要多少时间,求出哪个人把谣言传播到所有人的总时间最短,并求最短时间(一个人可以同时向自己所有朋友传播)。
转化题意:在一张有向图中从某一点出发到达每一个节点的最短路中的最大值,并找出最大值最小的那个节点和这个最小值。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 10005
using namespace std;
int e[maxn][maxn];
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++)
{
e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
}
}
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
e[i][j]=(i==j?0:maxn);
}
}
int m;
for(int i=1;i<=n;i++)
{
scanf("%d",&m);
for(int j=1;j<=m;j++)
{
int v,w;
scanf("%d%d",&v,&w);
e[i][v]=w;
}
}
floyd();
int MIN=maxn,k;
for(int i=1;i<=n;i++)
{
int MAX=0;
for(int j=1;j<=n;j++)
{
MAX=max(MAX,e[i][j]);
}
if(MAX<MIN)
{
k=i;
MIN=MAX;
}
}
if(MIN==maxn)
printf("disjoint\n");
else
printf("%d %d\n", k, MIN);
}
return 0;
}
用了Floyd,时间复杂度$O(n^{3})$,代码简单,适用于n值较小和时间复杂度要求不高的图问题。