Six degrees of Kevin Bacon
转自:https://blog.csdn.net/a17865569022/article/details/78766867
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 .]
思路:最短路问题。
在建图的时候要注意将对角线一列设为0,其余在初始状态下设为INF无穷大
然后将在一个集合的元素之间的距离设为1(这里的图为对称矩阵!!)
之后再用Floyd算法更新间接有关系的坐标Map[i][j]=min(Map[i][j],Map[i][k]+Map[k][j]);
最后输出Min*100/(n-1)(这里注意,一定要先乘100,再去取平均,int的数不能整除的话会舍去小数点后面的数,导致结果扩大100倍后误差较大!!!)
#include<cstdio> #include<cstring> #include<algorithm> #define INF 99999999 using namespace std; int main() { int n,m,t,a[305]; int Map[305][305]; scanf("%d %d",&n,&m); for(int i=0;i<=n;i++) { Map[i][i]=0; for(int j=i+1;j<=n;j++) Map[i][j]=Map[j][i]=INF; } for(int i=1;i<=m;i++) { scanf("%d",&t); for(int j=1;j<=t;j++) scanf("%d",&a[j]); for(int x=1;x<=t;x++) for(int y=x+1;y<=t;y++) Map[a[x]][a[y]]=Map[a[y]][a[x]]=1; } for(int k=1;k<=n;k++)//Floyd算法 { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { Map[i][j]=min(Map[i][j], Map[i][k]+Map[k][j]); } } } /*for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) printf("%10d",Map[i][j]); printf("\n"); }*/ int Min=INF,temp; for(int i=1;i<=n;i++) { temp=0; for(int j=1;j<=n;j++) temp+=Map[i][j]; if(temp<Min) Min=temp; } printf("%d\n",Min*100/(n-1));//重要点,先乘后除,防止误差过大 return 0; }