题意:奶牛们最近要拍电影了……
1、若两个的奶牛一起工作则,他们相互的度(degrees)为;
2、若两只奶牛a、b不一起工作,但与另有一只奶牛都和他们工作,则a、b的相互的度为2。
求奶牛的与其他奶牛的度的平均值的一百倍的整数。
转换成图则是求一个点到其他点距离的平均值的一百倍。
(任意两点最短路,Floyd)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
using namespace std;
int const MAXN = 301, MAXM = 10001, INF = 0x3f3f3f3f;
int d[MAXN][MAXN], t[MAXM];
int N, M;
void Floyd()
{
for(int k = 0; k < N; k++)
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
d[i][j] = min(d[i][j], d[i][k]+d[k][j]);
}
int main()
{
while(scanf("%d%d", &N, &M) != EOF)
{
memset(d, 0x3f, sizeof(d));
//int u, v, w;
//for(int i = 0; i < M; i++)
//{
// scanf("%d%d%d", &u, &v, &w);
// d[u][v] = w;
//}
int n;
for(int j = 0; j < M; j++)
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &t[i]);
for(int i = 0; i < n; i++)
for(int j = i+1; j < n; j++)
{
d[t[i]][t[j]] = 1;
d[t[j]][t[i]] = 1;
}
}
Floyd();
//for(int i = 1; i <= N; i++)
//{
// for(int j = 1; j <= N; j++)
// printf("%d ", d[i][j]);
// printf("\n");
//}
int ans = INF;
for(int i = 1; i <= N; i++)
{
int sum = 0;
for(int j = 1; j <= N; j++)
if(i!=j)
sum += d[i][j];
ans = min(ans, sum);
}
printf("%d\n", ans*100/(N-1));
}
return 0;
}