POJ 2139 Six Degrees of Cowvin Bacon Floyd最短路

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值