POJ 2139 Six Degrees of Cowvin Bacon Floyd最短路

来源:互联网 发布:数据泄密 编辑:程序博客网 时间:2024/05/29 18:37

POJ2139

Description

The cows havebeen making movies lately, so they are ready to play a variant of the famousgame "Six Degrees of Kevin Bacon". 

The game works like this: each cow is considered to be zero degrees ofseparation (degrees) away from herself. If two distinct cows have been in amovie together, each is considered to be one 'degree' away from the other. If atwo cows have never worked together but have both worked with a third cow, theyare considered to be two 'degrees' away from each other (counted as: one degreeto the cow they've worked with and one more to the other cow). This scales tothe general case. 

The N (2 <= N <= 300) cows are interested in figuring out which cow hasthe smallest average degree of separation from all the other cows. excludingherself of course. The cows have made M (1 <= M <= 10000) movies and itis guaranteed that some relationship path exists between every pair ofcows. 

Input

* Line 1: Twospace-separated integers: N and M 

* Lines 2..M+1: Each input line contains a set of two or more space-separatedintegers that describes the cows appearing in a single movie. The first integeris the number of cows participating in the described movie, (e.g., Mi); thesubsequent Mi integers tell which cows were. 

Output

* Line 1: Asingle integer that is 100 times the shortest mean degree of separation of anyof the cows. 

Sample Input

4 2

3 1 2 3

2 3 4

Sample Output

100

Hint

[Cow 3 hasworked with all the other cows and thus has degrees of separation: 1, 1, and 1-- a mean of 1.00 .] 

 

 

题目大意:N头牛,拍了M部电影,同一部电影中的搭档们距离1,求最小度数之和。求奶牛的与其他奶牛的度的平均值的一百倍的整数。

转换成图则是求一个点到其他点距离的平均值的一百倍。

(任意两点最短路,Floyd)

(求的时候,先扩大一百倍再求平均值)

#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<string>#include<cstring>#include<cstdio>const int INF=0x3f3f3f3f;typedef long long LL;using namespace std;const int maxn=305;int N,M;int G[maxn][maxn];int a[maxn];void ford(){for(int k=1;k<=N;k++)for(int i=1;i<=N;i++)for(int j=1;j<=N;j++) G[i][j]=min(G[i][j],G[i][k]+G[k][j]);} int main(){//freopen("E:\\ACM\\test.txt","r",stdin);while(cin>>N>>M){for(int i=0;i<=N;i++)for(int j=0;j<=N;j++)if(i==j) G[i][j]=0;else G[i][j]=INF;int t;for(int i=0;i<M;i++){cin>>t;for(int i=0;i<t;i++)cin>>a[i];for(int i=0;i<t;i++) //同一部电影中任意两头牛的距离为1 for(int j=i+1;j<t;j++)G[a[i]][a[j]]=G[a[j]][a[i]]=1;}ford();int sum,ans=INF; for(int i=1;i<=N;i++){sum=0;for(int j=1;j<=N;j++) //枚举所有距离中的最小值 sum+=G[i][j];ans=min(ans,sum);}cout<<ans*100/(N-1)<<endl; //那一头牛与其它牛距离的平均值}return 0;}



原创粉丝点击