(并查集 建立关系)食物链 -- POJ-- 1182

链接:

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

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82830#problem/E

代码:

#include<stdio.h>
#include<queue>
#include<stack>
#include<string.h>
using namespace std;

#define maxn 100005
#define oo 0xfffffff


int n, T;
int f[maxn], r[maxn];

int Find(int x)
{
    int k=f[x];
    if(f[x]!=x)
    {
        f[x]=Find(f[x]);
        r[x]=(r[x]+r[k])%3;
    }
    return f[x];
}

int main()
{
    scanf("%d%d", &n, &T);

    int i, d, a, b, fa, fb, ans=0;

    for(i=1; i<=n; i++)
    {
        f[i]=i;
        r[i]=0;
    }

    while(T--)
    {
        scanf("%d%d%d",  &d, &a, &b);
        fa=Find(a), fb=Find(b);

        if(a>n || b>n || (d==2&&a==b))
            ans++;
        else if(fa==fb && (d-1+r[b])%3!=r[a])
            ans++;
        else if(fa!=fb)
        {
            f[fa]=fb;
            r[fa]=((d-1)-r[a]+r[b]+3)%3;
        }
    }

    printf("%d
", ans);
    return 0;
}