题目

源地址:

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

理解

当初学习并查集的时候做得题目,是一个比较经典的关于并查集的题目

代码

#include<cstdio>

const int maxn = 2000 + 10;

int p[maxn];
int r[maxn];

int find(int x)
{
    if (x == p[x]) return x;

    int t = p[x];
    p[x] = find(p[x]);
    r[x] = (r[x] + r[t]) % 2;
    return p[x];
}

void Union(int x, int y)
{
    int fx = find(x);
    int fy = find(y);

    p[fx] = fy;
    r[fx] = (r[x] + 1 + r[y]) % 2;
}

void set(int n)
{
    for (int i = 1; i <= n; i++)
    {
        p[i] = i;
        r[i] = 0;
    }
}

int main(int argc, char const *argv[])
{
    int T;
    scanf("%d", &T);
    for (int i = 1; i <= T; i++)
    {
        int n, m;
        scanf("%d%d", &n, &m);

        set(n);

        int x, y;
        bool flag = true;
        while (m--)
        {
            scanf("%d%d", &x, &y);
            if (find(x) == find(y))
            {
                if (r[x] == r[y])
                {
                    flag = false;
                    continue;
                }
            }
            else Union(x, y);
        }
        printf("Scenario #%d:\n", i);
        if (flag) printf("No suspicious bugs found!\n");
        else printf("Suspicious bugs found!\n");
        printf("\n");
    }
    return 0;
}

更新日志

  • 2014年07月22日 已AC。