hdu 1829 带权并查集的运用类似于食物链但是更简单些

#include<stdio.h>
#define N  1100000
struct node {
int x,y;
}f[N],pre[N];
int find(int x) {
if(x!=pre[x].x) {
    int h=pre[x].x;
    pre[x].x=find(h);
    pre[x].y=(pre[x].y+pre[h].y)%2;
}
return pre[x].x;
}
int main() {
    int t,m,n,i,j,k,flag,cou=0;
    scanf("%d",&t);
    while(t--) {
        scanf("%d%d",&n,&m);
        for(i=0;i<m;i++)
            scanf("%d%d",&f[i].x,&f[i].y);
    for(i=1;i<=n;i++) {
        pre[i].x=i;
        pre[i].y=0;
    }
        flag=0;
        for(i=0;i<m;i++){
            j=find(f[i].x);
            k=find(f[i].y);
            if(j!=k)  {
            pre[j].x=k;
            pre[j].y=(pre[f[i].y].y-pre[f[i].x].y+1)%2;
            }
            else {
                if((pre[f[i].x].y-pre[f[i].y].y)%2==0) {
                    flag=1;
                break;
                }
            }
        }
        printf("Scenario #%d:
",++cou);
        if(flag)
            printf("Suspicious bugs found!

");
        else
            printf("No suspicious bugs found!

");

    }
return 0;
}

原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410712.html