poj1703并查集

  直接搞。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
#include<math.h>
using namespace std;

int father[222222];
int getfather(int x)
{
    if(x!=father[x]) father[x]=getfather(father[x]);
    return father[x];
}

int main()
{
    int t;int n,m;
    char str[100];
    int a;int b;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(int i = 1;i<=2*n;i++)
            father[i]=i;
        for(int i = 0 ;i< m;i++){
            scanf("%s",str); scanf("%d%d",&a,&b);
            int fa=getfather(a);int fb=getfather(b);int fa1= getfather(a+n); int fb1=getfather(b+n);
            if(str[0]==‘A‘){
            if(fa==fb){
                cout<<"In the same gang."<<endl;
            }
            else
            if(fa1==fb&&fb1==fa)
            cout<<"In different gangs."<<endl;
            else{
                cout<<"Not sure yet."<<endl;
            }
            }
            else{
              //  cout<<father[fa]<<" "<<fb1<<endl;system("pause");
                father[fa]=fb1;father[fa1]=fb;
            }

        }
    }
    return 0;
}

poj1703并查集

时间: 2024-12-04 15:01:19

poj1703并查集的相关文章

Find them, Catch them.(POJ-1703)(并查集)

本题也是一道经典的并查集题目,只不过并不是直来直去的,因为需要维护两组关系:同一伙.不是同一伙. 那要怎么办呢,一开始我用了vector来保存对立面,建立两个并查集,结果很自然是超时的,因为循环了太多次. 之后看别人的题解,感觉有点复杂,看的不是很明白,只有一篇给出了一个简单的方法,然后我又重新看了食物链那道题,发现本题就是那道题的改编,可以使用相同的方法来维护多组关系. 就像食物链那道题一样,对每个人创建两个元素:i和i+n.用3*n个元素来建立并查集,这个并查集可以维护如下信息: 如果x和y

POJ1703并查集(区分两个集合)

题意:输入n,m.n个人,m个规定/询问.一共有两个集合,A:询问a,b是否在同一个集合?D:表明a,b不在同一个集合.输出有三种,不在同一集合,在同一集合,不确定. 解析:其实有点离散化的意思.传统并查集是合并两个集合,而这个题是分开两个集合.那么可以这么做,想办法进行合并操作.输入a,b,a,b没有了关系,但是可以规定,a+n,b属同一集合,a,b+n属于同一集合.即,n右边a+n的那些和b放入同一集合,n右边b+n的那些和a放入同一集合,这样a,b就撇开了关系.就可以进行join()操作了

详解并查集

详解并查集  Powered by WSY in SSF    2019-11-02  13:46 [1]并查集的定义:   并查集(Disjoint  Set)是一种非常精巧的非常实用的数据结构,它主要用来处理一些不相交集合的合并问题,经典的例子有联通子图,最小生成树的克鲁斯-卡尔算法. [2]并查集的经典问题:   我们通常使用“帮派”.“团伙”等问题举例说明并查集.例如帮派问题: 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌

读书笔记 之 数据结构(并查集详解)(POJ1703)

<ACM/ICPC算法训练教程>读书笔记-这一次补上并查集的部分.将对并查集的思想进行详细阐述,并附上本人AC掉POJ1703的Code. 在一些有N个元素的集合应用问题中,通常会将每个元素构成单元素集合,然后按照一定顺序将同属一组的集合合并,期间要反复查找每一个元素在哪个集合中.这类问题往往看似简单,但是数据量很大,因此容易造成TLE或MLE,也就是空间度和时间度极其复杂.因此在这里,我们引入一种抽象的特殊数据结构——并查集. 并查集:类似一个族谱,每个结点均有一个father[x]来表示x

poj1703 Find them,Catch them 【并查集】

做过一些的带权并查集,再来做所谓的"种类并查集",发现好像就顿悟了. 种类并查集与带权并查集实质上的差别并不大, 关键的区别就是种类并查集只是带权并查集再弄个%取余操作而已,然后余数就表示他属于哪个种类. 这题只有两个种类,也就是只有0和1两种, 对于两个不同的种类,那么之间的权值是相差1的,所以按照带权并查集的方法做加上1,然后取余2即可. #include<cstdio> const int N = 100005; int n, m, f[N], rank[N]; in

poj1703 Find them, Catch them(带权并查集)

题目链接 http://poj.org/problem?id=1703 题意 有两个帮派:龙帮和蛇帮,两个帮派共有n个人(编号1~n),输入m组数据,每组数据为D [a][b]或A [a][b],D[a][b]表示a,b属于不同的帮派,A [a][b]则让我们判断a,b是否属于一个帮派,根据判断的结果进行相应的输出. 思路 这题和poj2492很像,使用并查集解决,方法我已在poj2492的题解中写出,这里不再赘述. 代码 1 #include <cstdio> 2 using namespa

[POJ1703]Find them, Catch them(并查集)

传送门 1.开两个并查集 f[x] 表示 x 的同类 f[x + n] 表示 x 的敌人 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 200001 4 5 int T, n, m; 6 int f[N]; 7 8 inline int read() 9 { 10 int x = 0, f = 1; 11 char ch = getchar(); 12 for(; !isdigit(ch); ch = getc

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, Gang Dragon and Gang Snake. However, the police first needs to identify which gang a criminal belongs to. The present

[poj1703]Find them, Catch them(种类并查集)

题意:食物链的弱化版本 解题关键:种类并查集,注意向量的合成. $rank$为1代表与父亲对立,$rank$为0代表与父亲同类. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> using namespace std; typedef long long ll; #de