题目:http://poj.org/problem?id=1125
题意:给出一个社交网络,每个人有几个别人可以传播谣言,传播谣言需要时间。问要使得谣言传播的最快,应该从那个人开始传播谣言以及使得所有人都知道这个谣言需要多少时间,、
时间的定义是使得最后一个人知道这个谣言的时间。多元最短路
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<stack> 6 #include<queue> 7 #include<iomanip> 8 #include<cmath> 9 #include<algorithm> 10 #include<map> 11 using namespace std; 12 13 const int INF= 1<<28; 14 int G[150][150],n; 15 int min_n(int a,int b) 16 { 17 return a>b?b:a; 18 } 19 void floyd() 20 { 21 int i,j,k; 22 for(k=1; k<=n; k++) 23 for(i=1; i<=n; i++) 24 for(j=1; j<=n; j++) 25 G[i][j]=min_n(G[i][j],G[i][k]+G[k][j]); 26 } 27 int main() 28 { 29 int i,j,m,a,b,f,ans,x,y; 30 while(cin>>n&&n) 31 { 32 for(i=1; i<=n; i++) 33 { 34 for(j=1; j<=n; j++) 35 G[i][j]=INF; 36 G[i][i]=0; 37 } 38 for(i=1; i<=n; i++) 39 { 40 cin>>m; 41 while(m--) 42 { 43 cin>>a>>b; 44 if(G[i][a]>b) 45 G[i][a]=b; 46 } 47 } 48 floyd(); 49 f = 0; x = INF; 50 for(i=1; i<=n; i++) 51 { 52 ans=-1; 53 for(j=1; j<=n; j++) 54 { 55 if(G[i][j]>=INF) 56 break; 57 if(ans<G[i][j]) 58 ans=G[i][j]; 59 } 60 if(j==n+1) 61 { 62 f=1; 63 if(x>ans) 64 { 65 x=ans; 66 y=i; 67 } 68 } 69 } 70 if(f) printf("%d %d ",y,x); 71 else cout<<"disjoint"<<endl; 72 } 73 return 0; 74 }
即 找一个最长 的