/*
translation:
有n头牛,在同一维空间里面视作距离为1,若是两头牛在不同维度但是有同一只牛跟他们俩的维度都
相同,则认为这两头牛距离为2.现在求从任意一头牛开始到其它牛距离的平均值最小是多少??
solution:
floyd算法直接搞
note:
1:floyd算法注意初始化要将距离初始化为INF,但是INF最好不要设为1e30,因为很有可能溢出。所以
最好将INF设置为比极限值大一点点就够了。
2:题意坑爹,没说好输出有没有截位!正确姿势见代码!
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 305;
const int INF = 3000000;
int G[maxn][maxn];
int n, m, cow[maxn];
int main()
{
//freopen("in.txt", "r", stdin);
while(~scanf("%d%d", &n, &m)) {
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(i != j) G[i][j] = INF;
else G[i][j] = 0;
int num;
for(int i = 0; i < m; i++) {
scanf("%d", &num);
for(int i = 0; i < num; i++) scanf("%d", &cow[i]);
for(int i = 0; i < num; i++) {
for(int j = 0; j < num; j++) {
if(i == j) G[cow[i]][cow[j]] = 0;
else G[cow[i]][cow[j]] = 1;
}
}
} //构建边
for(int k = 1; k <= n; k++) //floyd
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) G[i][j] = min(G[i][j], G[i][k] + G[k][j]);
int ans = 1e30, total;
for(int i = 1; i <= n; i++) {
total = 0;
for(int j = 1; j <= n; j++) {
total += G[i][j];
}
ans = min(ans, total);
}
printf("%d\n", 100 * ans / (n - 1));
}
return 0;
}
poj2139(最小生成树)
最新推荐文章于 2019-11-03 00:46:10 发布