【poj 1182】 食物链 题解&代码(C++)

来源:互联网 发布:新东方烹饪怎么样知乎 编辑:程序博客网 时间:2024/05/19 23:12

经典的并查集关系类问题,还是类似 poj1703 的方法,用x+n表示 x所吃的集合,用x+2×n表示 吃x的集合 ,然后用并查集连连连就行。。。

#include<iostream>#include<string.h>#include<stdio.h>using namespace std;int fa[509999];inline void chushihua(int n){        for (int i=1;i<=n;i++)  fa[i]=i;}int find(int x){        if (fa[x]==x)   return x;        return fa[x]=find(fa[x]);}int unio(int x,int y){        return fa[find(x)]=find(y);}int main(){        int n,m,a,b,c;        scanf("%d%d",&n,&m);        chushihua(3*n);    int ans=0;        for (int i=1;i<=m;i++)        {                scanf("%d%d%d",&a,&b,&c);                if (b>n || c>n || (a==2&&b==c) || b<=0 || c<=0)            {ans++;continue;}        if (a==1)        {            if (find(b)!=find(c) && find(c+n)!=find(b) && find(c+2*n)!=find(b) && find(c)!=find(b+n) &&find(c)!=find(b+n+n))            {                unio(b,c);                unio(b+n,c+n);                unio(b+2*n,c+2*n);            }            else if (find(b)==find(c))  continue;            else if (find(b)!=find(c) && (find(c+n)==find(b) || find(c+2*n)==find(b) || find(c)==find(b+n) || find(c)==find(b+n+n)))    ans++;        }        else if (a==2)        {            if (find(b)==find(c) || find(c)==find(b+n))                {ans++;continue;}            else {                unio(c+n,b);                unio(b+2*n,c);                unio(b+n,c+n+n);                }        }    }    cout<<ans<<endl;}
0 0
原创粉丝点击