题目链接:http://poj.org/problem?id=1125
#include <iostream> #include <cstring> #include <cmath> #define INF 0x3f3f3f3f using namespace std; /**************************************************************************************************************** 题意:给出一个社交网络,每个人有几个别人可以传播谣言,传播谣言需要时间。问要使得谣言 传播的最快,应该从那个人开始传播谣言以及使得所有人都知道这个谣言需要多少时间, 时间的定义是使得最后一个人知道这个谣言的时间。 思路: 1,floyd算法求得每两个点之间的最短路 2,遍历找到传播时间最小的 ****************************************************************************************************************/ int Map[105][105]; int main() { int n; while(cin>>n,n!=0) { memset(Map,INF,sizeof(Map)); for(int i = 1;i <= n;i ++){ int temp; cin>>temp; for(int j = 1;j <= temp;j ++){ int a,b; cin>>a>>b; Map[i][a]=b; } } for(int k = 1;k <= n;k ++) for(int i = 1;i <= n;i ++) for(int j = 1;j <= n;j ++) if(Map[i][k] < INF && Map[k][j] < INF && Map[i][k]+Map[k][j] < Map[i][j]) Map[i][j]=Map[i][k]+Map[k][j]; int id=0,ans=INF; for(int i = 1;i <= n;i ++){ int now=-1; for(int j = 1;j <= n;j ++){ if(i == j) continue; now=max(now,Map[i][j]); } if(now < ans){ ans=now; id=i; } } cout<<id<<" "<<ans<<endl; } return 0; }