poj2492 A Bug's Life【带权并查集】

题目链接:http://poj.org/problem?id=2492

题目描述:找基佬游戏(汗-_-b)有个hentai科学家研究虫子种群,不断地给出二元组xy,表示x和y是异性交往,但是可能会出现矛盾(找到基佬),比如1与2是异性恋,2与3是异性恋,却又告诉你1和3是异性恋。问种群中存不存在基佬败类

思路:与poj1182“食物链”几乎一样,还简单一点,毕竟只有两类物品。par[i]表示父节点,d[i]表示偏移量,0为同性,1为异性。不过要注意的一点是所有合并的过程要对二取模,比如x找到根结点s的路径是x1,x2...xn那么,d[x]=(d[x]+d[x1]+...d[xn])%2。poj1703与此题几乎一样,代码改改就能交了

#include <iostream>
#include <ios>
#include <iomanip>
#include <functional>
#include <algorithm>
#include <vector>
#include <sstream>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <climits>
using namespace std;
#define XINF INT_MAX
#define INF 1<<30
#define MAXN 2000+10
#define eps 1e-8
#define zero(a) fabs(a)<eps
#define sqr(a) ((a)*(a))
#define MP(X,Y) make_pair(X,Y)
#define PB(X) push_back(X)
#define PF(X) push_front(X)
#define REP(X,N) for(int X=0;X<N;X++)
#define REP2(X,L,R) for(int X=L;X<=R;X++)
#define DEP(X,R,L) for(int X=R;X>=L;X--)
#define CLR(A,X) memset(A,X,sizeof(A))
#define IT iterator
#define PI  acos(-1.0)
#define test puts("OK");
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
typedef long long ll;
typedef pair<int,int> PII;
typedef priority_queue<int,vector<int>,greater<int> > PQI;
typedef vector<PII> VII;
typedef vector<int> VI;
#define X first
#define Y second

int par[MAXN];
int d[MAXN];
int n,m;

int find(int x)
{
    int s,tot=0;
    for(s=x;par[s]>=0;s=par[s])
        tot+=d[s];
    while(s!=x)
    {
        int temp=par[x];
        par[x]=s;
        int tmp=d[x];
        d[x]=tot%2;
        tot-=tmp;
        x=temp;
    }
    return s;
}

int main()
{_
    int T;
    scanf("%d",&T);
    REP(k,T)
    {
        scanf("%d%d",&n,&m);
        CLR(par,-1);CLR(d,0);
        bool flag=1;
        REP(i,m)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            if(flag)
            {
                int r1=find(x),r2=find(y);
                if(r1!=r2)
                {
                    par[r2]=r1;
                    d[r2]=!(d[x]^d[y]);
                }
                else
                    if(!(d[x]^d[y]))
                        flag=0;
            }
        }
        printf("Scenario #%d:\n",k+1);
        if(!flag)
            printf("Suspicious bugs found!\n\n");
        else
            printf("No suspicious bugs found!\n\n");
    }
    return 0;
}

附poj1703 “Find them, Catch them”代码(c++OLE,g++AC...-_-b):

#include <iostream>
#include <ios>
#include <iomanip>
#include <functional>
#include <algorithm>
#include <vector>
#include <sstream>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <climits>
using namespace std;
#define XINF INT_MAX
#define INF 1<<30
#define MAXN 100000+10
#define eps 1e-8
#define zero(a) fabs(a)<eps
#define sqr(a) ((a)*(a))
#define MP(X,Y) make_pair(X,Y)
#define PB(X) push_back(X)
#define PF(X) push_front(X)
#define REP(X,N) for(int X=0;X<N;X++)
#define REP2(X,L,R) for(int X=L;X<=R;X++)
#define DEP(X,R,L) for(int X=R;X>=L;X--)
#define CLR(A,X) memset(A,X,sizeof(A))
#define IT iterator
#define PI  acos(-1.0)
#define test puts("OK");
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
typedef long long ll;
typedef pair<int,int> PII;
typedef priority_queue<int,vector<int>,greater<int> > PQI;
typedef vector<PII> VII;
typedef vector<int> VI;
#define X first
#define Y second

int par[MAXN];
int d[MAXN];
int n,m;

int find(int x)
{
    int s,tot=0;
    for(s=x;par[s]>=0;s=par[s])
        tot+=d[s];
    while(s!=x)
    {
        int temp=par[x];
        par[x]=s;
        int tmp=d[x];
        d[x]=tot%2;
        tot-=tmp;
        x=temp;
    }
    return s;
}

int main()
{_
    int T;
    scanf("%d",&T);
    REP(k,T)
    {
        scanf("%d%d",&n,&m);
        CLR(par,-1);CLR(d,0);
        REP(i,m)
        {
            char c;
            int x,y;
            scanf("%s%d%d",&c,&x,&y);
            int r1=find(x),r2=find(y);
            if(c==‘D‘)
            {
                if(r1!=r2)   //成环不管矛不矛盾直接舍弃,否则会反复迭代造成TLE
                {
                    par[r2]=r1;
                    d[r2]=!(d[x]^d[y]);
                }
            }
            else
            {
                if(r1!=r2)
                    printf("Not sure yet.\n");
                else if(d[x]^d[y])
                    printf("In different gangs.\n");
                else
                    printf("In the same gang.\n");
            }
        }
    }
    return 0;
}

poj2492 A Bug's Life【带权并查集】

时间: 2024-12-21 19:09:49

poj2492 A Bug's Life【带权并查集】的相关文章

POJ-2492.A Bug&#39;s Life(带权并查集)

A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 48043   Accepted: 15483 Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different gender

POJ 2492 A Bug&#39;s Life (带权并查集 &amp;&amp; 向量偏移)

题意 : 给你 n 只虫且性别只有公母, 接下来给出 m 个关系, 这 m 个关系中都是代表这两只虫能够交配, 就是默认异性, 问你在给出的关系中有没有与异性交配这一事实相反的, 即同性之间给出了交配关系. 分析 : 本题雷同POJ 1182 食物链, 如果会了那一题, 那现在这题便简单多了, 建议先了解食物链的偏移向量做法.这里也是使用向量的思考方式来进行relation的变化, 这里我令 relation = 0为同性, relation = 1为异性, 接下来的步骤就和食物链的雷同了. 优

poj2492A Bug&#39;s Life——带权并查集

题目:http://poj.org/problem?id=2492 所有元素加入同一个并查集中,通过其偏移量%2将其分类为同性与异性,据此判断事件. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int p,n,m,fa[2005],d[2005]; bool flag; int find(int x) { if(fa[x]==x)return x; el

hdu 1829 &amp;amp;poj 2492 A Bug&amp;#39;s Life(推断二分图、带权并查集)

A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8528    Accepted Submission(s): 2745 Problem Description Background  Professor Hopper is researching the sexual behavior of a rare

带权并查集 POJ1988 POJ2492

单纯的并查集很简单,带权并查集还能解决更多的问题,才更好玩,来个题热身.对于下面的知识,现在就当你已经熟练掌握了递归和并查集的路径压缩. POJ1988:题目链接 http://poj.org/problem?id=1988 题目大意:有N(N<=30,000)堆方块,开始每堆都是一个方块.方块编号1 – N. 有两种操作:  M x y : 表示把方块x所在的堆,拿起来叠放到y所在的堆上.  C x : 问方块x下面有多少个方块. 操作最多有 P (P<=100,000)次.对每次C操作

hdu 1829-A Bug&#39;s LIfe(简单带权并查集)

题意:Bug有两种性别,异性之间才交往, 让你根据数据判断是否存在同性恋,输入有 t 组数据,每组数据给出bug数量n, 和关系数m, 以下m行给出相交往的一对Bug编号 a, b.只需要判断有没有,按题目要求输出.这题有点坑的地方在于输出上多了一行空行,不PE都没注意到. 思路: 用一个数组gender[i] 记录当前节点 i 与根节点的关系,parent[i]数组记录当前节点的父节点. 因为是带权并查集,在Find_Parent 时更新当前节点与根节点的关系,且路径压缩至根节点下, 所以不用

A Bug&#39;s Life POJ - 2492 (带权并查集)

A Bug's Life POJ - 2492 Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of the opposite gender. In his experiment, indi

带权并查集(含种类并查集)【经典模板】 例题:①POJ 1182 食物链(经典)②HDU - 1829 A bug&#39;s life(简单) ③hihoCoder 1515 : 分数调查

带权并查集: 增加一个 value 值,并且每次合并和查找的时候需要去维护这个 value 例题一 :POJ 1182 食物链(经典) 题目链接:https://vjudge.net/contest/339425#problem/E 带权并查集的解法 定义两个数组fa[ ]和rela[ ],fa用来判断集合关系,rela用来描述其与根节点的关系.因为关系满足传递性,所以可以推导出给出条件下的当前关系,在判断与之前已有关系是否矛盾. 本题的解法巧妙地利用了模运算,rela数组用0表示同类,1表示当

并查集练习2(带权并查集)

明天旅游去爬山逛庙玩,今天练一天然后早早睡觉啦~ poj1703 Find them, Catch them (带权并查集) 1 #include<cstdio> 2 const int N=1e5+1; 3 int f[N]; 4 int r[N];//表示与父节点的关系,0同类,1不同类 5 int n; 6 void init(){ 7 for(int i=1;i<=n;++i){ 8 f[i]=i; r[i]=0; 9 } 10 } 11 int fin(int x){ 12 i