zoukankan      html  css  js  c++  java
  • POJ-1703 Find them, Catch them---并查集

    题目链接:

    https://vjudge.net/problem/POJ-1703

    题目大意:

    题目大意:在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙
    输入D x y代表x于y不在一个团伙里
    输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙里

    思路:

    POJ-1182类似

    对每个人设置两个元素,i-A,i-B,其中i-x表示i属于团伙x

    如果x和y不在一个团伙里面,那么合并x和y+n,合并x+n和y,这样就可以直接判断出xy的关系了,如果在查询的时候x和y在同一组,那么可以直接查询到他们已经合并在一起,如果x和y在不同的组,就可以查询到x和y+n在同一组,y和x+n在同一组,这就表示x和y不在同一组。如果不是上述情况那就是不能确定。

     1 #include<iostream>
     2 #include<vector>
     3 #include<queue>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<cstdio>
     7 #include<set>
     8 #include<map>
     9 #include<cmath>
    10 using namespace std;
    11 typedef pair<int, int> Pair;
    12 typedef long long ll;
    13 const int INF = 0x3f3f3f3f;
    14 int T, n, m, d;
    15 const int maxn = 1e6 + 10;
    16 int pa[maxn];
    17 
    18 int Find(int x)
    19 {
    20     return x == pa[x] ? x : pa[x] = Find(pa[x]);
    21 }
    22 void unite(int x, int y)
    23 {
    24     x = Find(x);
    25     y = Find(y);
    26     pa[x] = y;
    27 }
    28 int main()
    29 {
    30     scanf("%d", &T);
    31     getchar();
    32     while(T--)
    33     {
    34         scanf("%d%d", &n, &m);
    35         getchar();
    36         char c;
    37         int a, b;
    38         for(int i = 0; i <= 2 * n; i++)pa[i] = i;//这里初始化2*n个元素
    39         int a1, a2, b1, b2;
    40         while(m--)
    41         {
    42             scanf("%c %d %d", &c, &a, &b);
    43             getchar();
    44             if(c == 'A')
    45             {
    46                 a1 = Find(a);
    47                 b1 = Find(b), b2 = Find(b + n);
    48                 if(a1 == b1)
    49                     printf("In the same gang.
    ");
    50                 else if(a1 == b2)
    51                     printf("In different gangs.
    ");
    52                 else printf("Not sure yet.
    ");
    53             }
    54             else if(c == 'D')
    55             {
    56                 unite(a, b + n);
    57                 unite(b, a + n);
    58             }
    59         }
    60     }
    61 }
  • 相关阅读:
    flushdb()
    del()
    删除匹配某个pattern的一组键
    I函数
    字段映射
    maven技术(一)软件安装与配置
    jQuery监听事件经典例子
    IE中调试JS的一款很好的工具
    技术大牛是如何拿到国内IT巨头offer的?
    bzoj2124 等差子序列(hash+线段树)
  • 原文地址:https://www.cnblogs.com/fzl194/p/8819710.html
Copyright © 2011-2022 走看看