• 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 }
  • 相关阅读:
    php安装yaf,memcache,memcached模块
    django的ORM操作
    Composer简介
    MySQL中exists和in的区别及使用场景
    MySQL事务原理浅析
    MySQL JOIN原理
    mysql 子句、子查询、连接查询
    多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP
    数据库多表连接方式介绍-HASH-JOIN
    MySQL中的case when 中对于NULL值判断的坑
  • 原文地址:https://www.cnblogs.com/fzl194/p/8819710.html
Copyright © 2020-2023  润新知