文章标题 POJ 1182 : 食物链 (带权并查集)

来源:互联网 发布:日本知乎 编辑:程序博客网 时间:2024/06/05 07:33

传送门
思路参考自 http://blog.csdn.net/niushuai666/article/details/6981689
代码:

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <queue>#include <set>#include <map>#include <algorithm>#include <math.h>#include <vector>using namespace std;typedef long long ll;const int mod=1e9+7;const int maxn=50000+10;int n,k;//relation[i]为0表示当前i与其根节点直接的关系是同类,1 表示被根节点吃,2表示吃根节点int fa[maxn],relation[maxn]; int find(int x){    if (x==fa[x])return x;    int tmp=fa[x];    fa[x]=find(fa[x]);    relation[x]=(relation[x]+relation[tmp])%3;    return fa[x];} void init(){    for (int i=0;i<=n;i++){        fa[i]=i;        relation[i]=0;    }}int main(){    scanf ("%d%d",&n,&k);    init();    int ans=0;    int d,x,y;    while (k--){        scanf ("%d%d%d",&d,&x,&y);        if (x>n||y>n){            ans++;continue;        }        if(d==2){            if (x==y){                ans++;continue;            }        }        int fx=find(x);        int fy=find(y);        if (fx!=fy){            fa[fy]=fx;//fx->fy            //relation[fy]=fx->fy ==> fx->x + x->y + y->fy ==> relation[x]+(d-1)+3-relation[y]            relation[fy]=((relation[x]+d-1+3-relation[y])%3+3)%3;        }else {            int tmp=((3-relation[x]+relation[y])%3);            if (d==1&&relation[x]!=relation[y]){                ans++;                continue;            }            if (d==2&&tmp!=d-1){                ans++;                continue;            }        }    }    printf ("%d\n",ans);    return 0;}
阅读全文
0 0
原创粉丝点击