思路:floyd,任意两点最短距离。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
//思路:图论,最短路径问题。将牛当作点,将在同一处工作的牛连起来,权值为1。
int N,M,cow[305],dis[305][305],a[305];
int min(int m,int n)
{
return m < n ? m : n;
}
void floyd()
{
int i,j,k;
for(i = 1; i <= N; i++){
for(j = i + 1; j <= N; j++){
for(k = 1; k <= N; k++){
dis[i][j] = dis[j][i] = min(dis[i][j],dis[i][k] + dis[k][j]);
}
}
}
}
int main()
{
int i,j,k;
scanf("%d %d",&N,&M);
for(i = 1; i <= N; i++){
for(j = 1; j <= N; j++){
if(i == j) dis[i][j] = 0;
else dis[i][j] = 1000000;
}
}
for(i = 1; i <= M; i++){
int num;
scanf("%d",&num);
for(j = 1; j <= num; j++){
scanf("%d",&a[j]);
}
for(j = 1; j <= num; j++){
for(k = j + 1; k <= num; k++){
dis[a[j]][a[k]] = dis[a[k]][a[j]] = 1;
}
}
}
floyd();
int ans = 1000000;
for(i = 1; i <= N; i++){
int sum = 0;
for(j = 1; j <= N; j++){
sum += dis[i][j];
}
ans = min(sum,ans);
}
printf("%d\n",ans*100/(N-1));
return 0;
}