题目:
AC情况:
思路:
首先根据输入建立图,自己到自己的权值是0,其它的边是无穷大,如果某两头牛在一起演电影,则他们的边权值为1。题目要求出哪只牛到其他牛的平均距离最短,先求出任意两牛的最短距离,然后遍历找最小值。采用Floyd-arshall算法求出任意两牛的最短距离。
#include<iostream>
#include<algorithm>
using namespace std;
int d[301][301];
int x[301];
int N;
void varshall_floyd() {
for (int k = 0; k < N; k++)
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
d[i][j] = min(d[i][j],d[i][k]+d[k][j]);
}
int main() {
int M,i,j,ans= 0x3f3f3f3f,sum;
memset(d, 0x3f, sizeof(d));
scanf_s("%d%d", &N, &M);
for (i = 0; i < N; i++)
d[i][i] = 0;
while(M--){
int n;
scanf_s("%d", &n);
for (i = 0; i < n; i++) {
scanf_s("%d", &x[i]);
x[i]--;
}
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
d[x[i]][x[j]] = d[x[j]][x[i]] = 1;
}
varshall_floyd();
for (i = 0; i < N;i++) {
sum = 0;
for (j = 0; j < N; j++) {
sum += d[i][j];
}
ans = min(ans, sum);
}
printf("%d\n", 100*ans/(N-1));
return 0;
}