题目:
The cows have been making movies lately, so they are ready to play a variant of the famous game "Six Degrees of Kevin Bacon".
The game works like this: each cow is considered to be zero degrees of separation (degrees) away from herself. If two distinct cows have been in a movie together, each is considered to be one 'degree' away from the other. If a two cows have never worked together but have both worked with a third cow, they are considered to be two 'degrees' away from each other (counted as: one degree to the cow they've worked with and one more to the other cow). This scales to the general case.
The N (2 <= N <= 300) cows are interested in figuring out which cow has the smallest average degree of separation from all the other cows. excluding herself of course. The cows have made M (1 <= M <= 10000) movies and it is guaranteed that some relationship path exists between every pair of cows.
Input
* Line 1: Two space-separated integers: N and M
* Lines 2..M+1: Each input line contains a set of two or more space-separated integers that describes the cows appearing in a single movie. The first integer is the number of cows participating in the described movie, (e.g., Mi); the subsequent Mi integers tell which cows were.
Output
* Line 1: A single integer that is 100 times the shortest mean degree of separation of any of the cows.
Sample Input
4 2 3 1 2 3 2 3 4
Sample Output
100
Hint
[Cow 3 has worked with all the other cows and thus has degrees of separation: 1, 1, and 1 -- a mean of 1.00 .]
题意:
如果两头牛在一起拍过电影,那么这两头牛就互相认识,距离是1,如果两头牛之间没有拍过电影,但是同时和第三者拍过电影,那么这两头牛还是认识,距离是2;每一头牛会有一个认识度:认识的所有的牛到这头牛的距离之和 / 认识的牛的数量;
记得把结果扩大100倍;
思路:
这题的本质就是最短路,可以直接进行计算;
因为数据的范围不大,所以可以直接用Floyd-Warshall算法;
只要记得结果要扩大100倍;
代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int inf=99999999;
const int N=10010;
int map[N][N];//存储城市之间的距离;
int n,m,q;
int aa,bb,cc;
int a[N];
void init()//初始化;
{
for(int i=1; i<=n; i++)
{
for(int 0.0j=1; j<=n; j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=inf;
}
}
}
void qq(int x)//输入的时候初始化;
{
int ii,jj;
for(int i=0; i<x-1; i++)
{
for(int j=i+1; j<x; j++)
{
ii=a[i];
jj=a[j];
map[ii][jj]=map[jj][ii]=1;//无向图;
}
}
return ;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=0; i<m; i++)
{
scanf("%d",&q);
for(int j=0; j<q; j++)
scanf("%d",&a[j]);
qq(q);
}
//Floyd-Warshall算法;
for(int k=1; k<=n; k++) //中转点;
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
}
int minn=N,pp;
for(int i=1; i<=n; i++)
{
int sum=0,s=0;
for(int j=1; j<=n; j++)
{
if(map[i][j]!=inf)
{
sum++;
s+=map[i][j];
}
}
sum--;
pp=s*100/sum;//记得扩大100倍;
minn=min(minn,pp);
}
printf("%d\n",minn);
}
return 0;
}