A Bug's Life____并查集

English preparation:

falsify      伪造;篡改;歪曲;证明...虚假

the sexual behavior of a rare species of bugs.  一种稀有昆虫的性行为。

the number of scenarios      场景数量

consecutively  连续地

 

趣语:

这个时代,是个雷人的时代。凤姐的出现,让我们对自己的审美观产生了怀疑;
著姐的降临,使我们对自己的性取向做出了更正。而如今,bug们被同性恋了,这直接就是商人们为了扩大HS产业的炒作。
哪一天,也许你也被变态了,被脑残了。。。

 

题目大意:给出n条虫子,m个配对(男<->女)的情况,问数据有没有错误(出现同性配对)?

 

Reference:

1.https://blog.csdn.net/freezhanacmore/article/details/8799495

2.https://www.cnblogs.com/dongsheng/archive/2012/08/08/2627917.html

3.https://blog.csdn.net/pku_Coder/article/details/53520171

 

codes:

#include<cstdio>
#include<iostream>
const int maxn=2000+10;
int p[maxn]; //记录父节点
int r[maxn]; //记录与父节点关系, 0 同类, 1异类
 
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; //r[]没有方向.我就是这一步的关系,这一个式子,这一处关节没有搞明白! 
}
void set(int n)
{
    for(int i=1;i<=n;i++)
    {
        p[i]=i;
        r[i]=0;
    }
}

int main()
{
    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;
}

 

 
 
 

 

posted @ 2019-10-05 15:29  龙龙666666  阅读(140)  评论(0编辑  收藏  举报