poj 2139

来源:互联网 发布:mac虚拟机win10激活 编辑:程序博客网 时间:2024/05/22 02:22

http://poj.org/problem?id=2139

题目好烂 再次吐槽 我都没看懂orz

n头奶牛,m部电影,每部电影告诉你是哪几头奶牛.如果两头奶牛在一起出演就相互度=1,如果两头奶牛没有一起出演过,但是同时跟第三头奶牛出演过,那么这两头奶牛的相互度就等于他们与第三头奶牛的相互度之和。要求输出牛的最小平均分开度的100倍。这题目也够难懂得。最坑爹的地方是没有给出输出的格式,不知道是进位还是去尾。

本题题意可以变换的理解为如果N个点在一个集合中,则这些点之间的距离为1。然后由此建立一个无向图。在这N个点中,每一个点与其他的所有点都有一个连接的路径长度,将这些长度都加起来,然后除以N-1,就求出了平均长度。题目所求为这些平均长度中的最小值,然后将最小值乘以100输出。 
由于所有点到其他点的距离都要求,这个题用floyd算法最为合适,

using namespace std;const int N = 300;const int INF = 0x3f3f3f3f;int d[N+1][N+1];int n;void input(){    int m;    cin >> n >> m;    for (int i = 1; i <= n; i ++)        fill(d[i]+1, d[i]+1+n, INF);    while ( m-- ) {        int k, movie[N];        cin >> k;        for (int i = 0; i < k; i++) {            scanf("%d", &movie[i]);        }        for (int i = 0; i < k; i++) {            for (int j = i+1; j < k; j++) {                d[movie[i]][movie[j]] = 1;                 d[movie[j]][movie[i]] = 1;             }        }    }}void solve(){    for (int k = 1; k <= n; k ++) {         for (int i = 1; i <= n; i ++) {            for (int j = 1; j <= n; j ++) {                d[i][j] = min(d[i][j], d[i][k]+d[k][j]);            }        }    }    int sum;    int msum = INF;    for (int i = 1; i <= n; i ++) {        sum = 0;        for (int j = 1; j <= n; j ++) {            if (i == j) continue;            sum += d[i][j];        }        msum = (sum < msum) ? sum : msum;    }    double res = (double)msum / (n-1) * 100;    printf("%d\n", (int)res);}int main(void){    input();    solve();    return 0;}


原创粉丝点击