题意:
给定一些牛的关系,他们之间的距离为1。
然后求当前这只牛到每只牛的最短路的和,除以 n - 1只牛的最大值。
解析:
floyd来求最短路。
然后枚举求max就行了。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1
using namespace std;
const int maxn = 300 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);
int n, m;
int g[maxn][maxn];
int x[maxn];
void floyd()
{
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
}
}
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
while (~scanf("%d%d", &n, &m))
{
memset(g, inf, sizeof(g));
for (int i = 0; i < n; i++)
g[i][i] = 0;
while (m--)
{
int num;
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
scanf("%d", &x[i]);
x[i]--;
}
for (int i = 0; i < num; i++)
{
for (int j = i + 1; j < num; j++)
{
g[x[i]][x[j]] = g[x[j]][x[i]] = 1;
}
}
}
floyd();
int ans = inf;
for (int i = 0; i < n; i++)
{
int sum = 0;
for (int j = 0; j < n; j++)
{
sum += g[i][j];
}
ans = min(sum, ans);
}
printf("%d\n", 100 * ans / (n - 1));
}
return 0;
}