poj 1125 谣言传播 Floyd 模板题

时间:2023-03-09 07:53:15
poj 1125 谣言传播 Floyd 模板题

假如有3个点 点1到点2要5分钟 点1到点3要3分钟 那么5分钟的时间可以传遍全图 所以要先找一个点到其他点的最长时间 再从最长的时间里找出最小值

Sample Input

3 // 结点数
2 2 4 3 5 //点1与另外2个点相连 1->2 权值为4 1->3 权值为5
2 1 2 3 6 //点2与...
2 1 2 2 2//点3...
5
3 4 4 2 8 5 3
1 5 8
4 1 6 4 10 2 7 5 2
0
2 2 5 1 5
0
Sample Output

3 2
3 10

 # include <iostream>
# include <cstdio>
# include <cstring>
# include <string>
# include <algorithm>
# include <cmath>
# include <map>
# define LL long long
using namespace std ; const int MAXN = ;
const int INF = 0x3f3f3f3f;
int dis[MAXN][MAXN];
int n ; void floyed()//节点从1~n编号
{
int i,j,k;
for(k=;k<=n;k++)
for(i=;i<=n;i++)
for(j=;j<=n;j++)
if(dis[i][k]+dis[k][j] < dis[i][j])
dis[i][j]=dis[i][k]+dis[k][j]; } int main()
{
//freopen("in.txt","r",stdin) ;
while (scanf("%d" , &n) , n)
{
int i , j ;
for(i=;i<=n;i++)
for(j=;j<=n;j++)
{
if(i==j)dis[i][j]=;
else dis[i][j]=INF;
}
int m ,v ,w ;
for(i=;i<=n;i++)
{
scanf("%d" , &m) ;
while(m--)
{
scanf("%d %d" , &v , &w) ;
if (w < dis[i][v])
dis[i][v] = w ;
}
}
floyed() ;
int ans = INF ;
int k ;
for(i=;i<=n;i++)
{
int t = ;
for(j=;j<=n;j++)
{
if (i != j && dis[i][j] > t)
{
t = dis[i][j] ;
}
}
if (t < ans)
{
ans = t ;
k = i ;
}
}
if (ans != INF)
printf("%d %d\n" , k , ans) ;
else
printf("disjoint\n") ;
}
return ;
}