POJ

来源:互联网 发布:淘宝网大码女装店连衣裙 编辑:程序博客网 时间:2024/06/04 00:27

传送门:POJ2139

题意:牛们最近在拍电影,所以他们准备去玩一个游戏——“六度分割”的变体。 游戏是这样进行的:每个牛离自己的距离是0度,如果两个不同的牛同时出现在一个电影里,那么他们之间的距离为1度,如果两只牛从未一起工作,但它们都与第三只牛一起工作,那么他们之间的距离为2度。 这N(2<=N<=300)头牛对找出那只牛与所有牛之间的平均距离最短感兴趣。当然,不算上他自己。这些牛拍了M(1<=M<=10000)部电影,并且保证每两个牛之间都有一定的关系。求那一头牛与其它牛距离的平均值最小值,把它乘100输出。

思路:求任意两点间最短距离,典型floyd,注意一下输出的时候取下整数就行了。

#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>#define ll long long#define pb push_back#define fi first#define se second#define pi acos(-1)#define inf 0x3f3f3f3f#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define rep(i,x,n) for(int i=x;i<n;i++)#define per(i,n,x) for(int i=n;i>=x;i--)using namespace std;typedef pair<int,int>P;const int MAXN=100010;int gcd(int a,int b){return b?gcd(b,a%b):a;}int w[303][303], tmp[303];int main(){int n, m, t;scanf("%d %d", &n, &m);memset(w, inf, sizeof(w));for(int i = 1; i <= n; i++)w[i][i] = 0;while(m--){cin >> t;for(int i = 0; i < t; i++){cin >> tmp[i];}for(int i = 0; i < t; i++)for(int j = 0; j < i; j++)w[tmp[i]][tmp[j]] = w[tmp[j]][tmp[i]] = 1;}for(int k = 1; k <= n; k++)for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)w[i][j] = min(w[i][j], w[i][k] + w[k][j]);double ans = inf;for(int i = 1; i <= n; i++){int sum = 0;for(int j = 1; j <= n; j++)sum += w[i][j];ans = min(ans, sum * 100 * 1.0/ (n - 1));}printf("%d\n", (int)ans); return 0;}