poj 2139 floyd()

来源:互联网 发布:java 线程怎么实线的 编辑:程序博客网 时间:2024/06/04 18:52

题意:

给定一些牛的关系,他们之间的距离为1。

然后求当前这只牛到每只牛的最短路的和,除以 n - 1只牛的最大值。


解析:

floyd来求最短路。

然后枚举求max就行了。


代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <climits>#include <cassert>#define LL long long#define lson lo, mi, rt << 1#define rson mi + 1, hi, rt << 1 | 1using namespace std;const int maxn = 300 + 10;const int inf = 0x3f3f3f3f;const double eps = 1e-8;const double pi = acos(-1.0);const double ee = exp(1.0);int n, m;int g[maxn][maxn];int x[maxn];void floyd(){    for (int k = 0; k < n; k++)    {        for (int i = 0; i < n; i++)        {            for (int j = 0; j < n; j++)            {                g[i][j] = min(g[i][j], g[i][k] + g[k][j]);            }        }    }}int main(){#ifdef LOCAL    freopen("in.txt", "r", stdin);#endif // LOCAL    while (~scanf("%d%d", &n, &m))    {        memset(g, inf, sizeof(g));        for (int i = 0; i < n; i++)            g[i][i] = 0;        while (m--)        {            int num;            scanf("%d", &num);            for (int i = 0; i < num; i++)            {                scanf("%d", &x[i]);                x[i]--;            }            for (int i = 0; i < num; i++)            {                for (int j = i + 1; j < num; j++)                {                    g[x[i]][x[j]] = g[x[j]][x[i]] = 1;                }            }        }        floyd();        int ans = inf;        for (int i = 0; i < n; i++)        {            int sum = 0;            for (int j = 0; j < n; j++)            {                sum += g[i][j];            }            ans = min(sum, ans);        }        printf("%d\n", 100 * ans / (n - 1));    }    return 0;}


0 0
原创粉丝点击