poj1703

poj 1703(并查集) 题意:有n个人和两个阵营,给出两种操作,A a b ,询问a和b的是否在同一个阵营,如果有人未加入任何阵营输入不确定。D a b,让a和b成为不同阵营的。 题解:两种做法。 一种是把并查集扩大一倍,先给每个人一个假定的敌人,然后有D操作时把敌人加入到假定敌人的集合中,A操作判断a和b是否在同一个集合,如果不在判断对方是否在自己假定敌人的集合中,在就是敌人,否则是不确定。#include <std 阅读详情

链接:点击打开链接

题意:有N个罪犯,M条关系有两种可能,分别为"D[a][b]"代表a,b为不同团体,"A [a] [b]"则输出相应的关系

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int par[1000005],rank[1000005];
int T,N,M;
void init(int n){
    int i;
    for(i=0;i<=2*n;i++){
        par[i]=i;
        rank[i]=0;
    }
}
int find(int x){
    if(par[x]==x)
    return par[x];
    return par[x]=find(par[x]);
}
void unite(int x,int y){
    x=find(x);
    y=find(y);
    if(x==y)
    return;
    if(rank[x]<rank[y])
    par[x]=y;
    else{
        par[y]=x;
        if(rank[x]==rank[y])
        rank[x]++;
    }
}
bool same(int x,int y){
    return find(x)==find(y);
}                                   //并查集模板
int main(){
    int i,j,x,y;
    char c;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&N,&M);
        init(2*N);
        for(i=0;i<M;i++){
            scanf(" %c",&c);
            scanf("%d%d",&x,&y);
            if(c=='D'){             //用x表示属于x属于第一个团体,x+N属于第二个团体,用两个人的关系
                unite(x,y+N);       //维护每个集合,每个集合的意义在于集合中所有的事情一定同时发生
                unite(y,x+N);       //也就是所有人都符合逻辑关系,而不一定是所有人都是同一个团体
            }
            else{
                if(same(x,y))
                puts("In the same gang.");
                else if(same(x,y+N)||same(x+N,y))
                puts("In different gangs.");
                else
                puts("Not sure yet.");
            }
        }
    }
    return 0;
}

poj1703 Find them, Catch them 这是题目: 3:Find them, Catch them 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, G 阅读详情

相关推荐

poj 1703 罪犯的帮派

并查集基础题目 http://blog.sina.com.cn/s/blog_6635898a0100kco0.html 这里用opp数组表示不在一个帮派的编号(2值)感觉思路比较清晰 #include #include #include #include #include #include #include #include #include #incl

cfzjxz的专栏 883

poj1703(种类并查集)

题目链接:http://poj.org/problem?id=1703 题目: 警方决定捣毁两大犯罪团伙:龙帮和蛇帮,显然一个帮派至少有一人。该城有N个罪犯,编号从1至N(N&lt;=100000。将有M(M&lt;=100000)次操作。 D a b 表示a、b是不同帮派 A a b 询问a、b关系 Input 多组数据。第一行是数据总数 T (1 &lt;= T &lt;= 20)...

行云出岫 656

【题解-POJ1703 Find them, Catch them

WA,还在找BUG😩。

写代码的犄角旮瘩 737

POJ 1703 (多集合 并查集)

/* 解决这题的关键在于,维护多种集合的关系;由于给的关系是两对立的,就需要第一个元素的反面是第二个元素的集合, 第二个元素的反面是第一个元素的集合。有利于判断两个元素是同一集合,还是不能判断; 比如,输入1 5 5 A(1,2) ;这时,1的反面是6 ,2的反面是7;他们的集合各不相同,所以不能判断; 再输入D(1,2); 由于我上面定的规矩,1 和 7 同一个集合,2 和 6 在一

julicliy的博客 366

POJ 1703 Find them, Catch them

这道题与POJ 2492 几乎一模一样,就不多说了,直接上代码吧 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 7 const int maxn = 10...

weixin_30711917的博客 145

poj1703(并查集维护不同集合关系的方法)

/* translation: 已知所有元素要么属于第一个集合,要么属于第二个集合,给出两种操作。第一种是D a b,表示 a,b两个元素不在一个集合里面。第二种操作是A a b,表示询问a,b两个元素是否在同一个集合 里面。如果不能确定的话打印not sure。否则给出答案。 solution: 并查集。 这道题有点类似poj1182(食物链),两题的关键点都在于如何维护不同集合的关系

林伏案的博客 3177

【种类并查集】 -- poj1703

题目来源: poj 1703 现在做并查集的题目好像越来越有感觉了开心。 思路: #include <iostream> #include <algorithm> #include <cstdio> #include <map> using namespace std; const int maxn = 100010; int n, m; int f...

圣托里尼的日落啊~的博客 219

poj 1703

http://poj.org/problem?id=1703 rank 用于记录祖先的等级 opp 用于记录敌人。。 1 #include <iostream> 2 #include<cstdio> 3 using namespace std; 4 int f[100005]; 5 int rank[100005],opp[100005...

a18865477815的博客 161

POJ1703Find them, Catch them 【种类并查集】

题目链接:http://poj.org/problem?id=1703 题目大意:给n个人,m次询问。A代表询问a, b之间的关系,D代表给出a, b属于不同的帮派。 我的想法: 太菜了,上课的时候没想到这种方法。 思路: 1.感觉有点像2-sat的思想,对于D给出的a, b两人属于不同帮派。我们就将a于b的对立点用并查集维护在一个集合中,也将b于a的对立点连通。 2.查询时...

a6334167的博客 172

POJ 1703

题目链接:http://poj.org/problem?id=1703 题目大意:两组犯罪团体,抓住N个人,他们属于且唯一属于两组犯罪团体之一。然后,给你M条信息,也分两类。D类信息说明id0和id1是不同组织的,A类信息是询问id0和id1的关系,包括不同组织,相同组织和无法判断。 解题思路:        并查集,但简单并查集思路与该题目不符合。因为简单并查集会告诉你两个目标是相

交流学习实践 568

POJ1703 并查集

POJ1703题目大意:警察抓获N个罪犯,这些罪犯只可能属于两个团伙中的一个,现在给出M个条件(D a b表示a和b不在同一团伙), 对于每一个询问(A a b)确定a,b是不是属于同一团伙或者不能确定。 这道题我用了两个并查集,把每个罪犯复制出两个来。一个是原来的,一个对称后的,以判断a b的相对团伙。 同一个集合表示可以有一个罪犯所述团伙推出其他罪犯所属团伙,用于判断是否能确定。 代码:

NEPTUNEl123的博客 483

poj1703 Find them Catch them

http://www.elijahqi.win/2018/01/12/poj1703-find-them-catch-them/ ‎ Description The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city

Elijahqi 381

POJ 1703 Find them, Catch them(种类并查集)

题目地址:POJ 1703 种类并查集水题。 代码如下: #include #include #include #include #include #include #include #include #include #include #include using namespace std; int bin[600000], rank[600000]; int f

scf0920 1273

POJ 1703 Find them, Catch them】并查集

题目链接:http://poj.org/problem?id=1703 题目大意: 给定m个操作: D x y:x罪犯和y罪犯不在一个团伙。(总共只有两个团伙) A x y:询问x和y罪犯的关系 解题思路: 很容易想到是并查集,但最后还是让我纠结了良久。一直MLE。 对于每次的D x y操作,每次不仅要找到两个不同集合标志头进行更新,还要更新a数组,即...

baidui8622的博客 88

POJ1703 Find them, Catch them

题目链接:http://poj.org/problem?id=1703 大概思路:题目要确认的有三种结果,所以不能直接找出a的不同集合再与b合并。由于事先并不知道a、b是哪一派别的,所以开一个2*maxn大的数组,分成两个派别:a属于a,a属于a+maxn。每次执行D操作其实就是合并(a,b+maxn)和(a+maxn,b),最后判断a,b是否同一派别,a,b+maxn是否同一派别即可。 TL

sun_apple_123 281

【并查集】模板 + 【HDU 1213、HDU 1232、POJ 2236、POJ 1703】例题详解

不想看模板,想直接看题目的请戳下面目录: 目录: HDU 1213 How Many Tables【传送门】 HDU 1232 畅通工程 【传送门】 POJ 2236 Wireless Network 【传送门】 POJ 1703 Find them, Catch them 【传送门】 先上模板: #define MAXN 根据编号需要 int per[MAXN],rank[MAX...

lesileqin的博客 282

poj 1182,poj 1703,hdu 1829

这一类的题目都是n个东西属于不同的集合,集合中的情况要么同时发生,要么同时不发生。 poj 1182 是书上的题目,有详解 poj 1703 和 hdu 1829 都是只有两个集合 poj 1703 #include <cstdio> const int N = 1e5 * 2 + 10; char s[2]; int n,m,x,y,fa[N],t; int find(int x)...

winhcc的博客 229
上一篇: poj3614
下一篇: Codeforce 414B(递推)
Stayaccept
博客等级 码龄12年 89粉丝 557原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值