POJ 2492 A Bug's Life

题目链接
题意:T组数,每组数先输入虫子的总数N与发生关系的数目M,虫子分雌雄两种,下面有M行,每行两个数a,b,代表虫子a、b发生了不可描述的关系,问虫子中是否存在同性恋(依据前面发生的关系推测)。(污污的)
题目解析:并查集。一开始想的是在同一个集合的虫子不能发生关系,想法是对的,但这时候考虑的集合的属性是发生关系。
3 3
1 2
2 3
3 1
这组数是有同性恋的,没错。
4 4
1 2
2 3
3 4
1 4
这组数不存在,A-B-A-B的情况。
又因为输入时的顺序并不是按照雌雄给出的,所以就有点纠结。
换个角度考虑,把集合的属性定义为性别,思路就豁然开朗了许多。

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <climits>
using namespace std;
const int MAXN=4*1e3+10;
int parent[MAXN];
int N, M;
bool flag;
int Find(int a)
{
    while(parent[a]!=a)
        a=parent[a];
    return a;
}
void start()
{
    for(int i=0;i<MAXN;i++)
        parent[i]=i;
    flag=false;
}
void add(int a, int b)
{
    a=Find(a);
    b=Find(b);
    parent[a]=b;
}
int main()
{
    int T;
    cin>>T;
    for(int t=1; t<=T; t++)
    {
        scanf("%d%d",&N,&M);
        int a, b;
        start();
        while(M--)
        {
            scanf("%d%d",&a,&b);
            if(flag)continue;
            int c=Find(a);
            int d=Find(b);
            if(c!=d)
            {
                add(a,b+N);///a与b是异性,b+N代表的是与b异性的集合,所以把a加到与b异性的集合b+N中去。
                add(b,a+N);
            }
            else
                flag=true;
        }
        cout<<"Scenario #"<<t<<':'<<endl;
        if(flag)
            cout<<"Suspicious bugs found!"<<endl<<endl;
        else
            cout<<"No suspicious bugs found!"<<endl<<endl;;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值