A Bug's Life(带权并查集)POJ - 2492

Bug有两种性别,异性之间才交往, 让你根据数据判断是否存在同性恋,输入有 t 组数据,每组数据给出bug数量n, 和关系数m, 以下m行给出相交往的一对Bug编号 a, b。只需要判断有没有,按题目要求输出。


 

思路:我们开一个两倍的数组,存上对应的关系。

例如:有n个bug,其中(2, 3),(3,4),(2,4)是交往关系

记为(2,3+n),(2+n,3)为两对。

(3,4+n),(3+n,4)为两对。

因为(3+n,4)和(2,3+n)都为交往关系

所以2,4都指向3+n;所以2和4同性。

而2,4又是交往的。

所以是同性恋


 

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include <sstream>
#include<vector>
#include<cmath>    
#include<stack>
#include<time.h>
#include<ctime>
using namespace std;
#define inf 1<<30
#define eps 1e-7
#define LD long double
#define LL long long
#define maxn 100000005    
int pre[100009] = {};
int rootsearch(int root)
{
    int son;
    son = root;
    while (root != pre[root])//这个数不是领导,继续往下找
    {
        root = pre[root];
    }
    while (son != root)//路径压缩,把找到的下级数全部指向最高领导
    {
        int temp = pre[son];
        pre[son] = root;
        son = temp;
    }
    return root;//返回最高领导
}
int main()
{
    int T, Case = 1;
    scanf("%d", &T);
    while (T--)
    {
        memset(pre, 0, sizeof(pre));
        int n, m;
        int a, b, flag = 0;
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= 2*n; i++)
        {
            pre[i] = i;
        }
        for (int i = 1; i <= m; i++)
        {
            scanf("%d%d", &a, &b);
            if (rootsearch(a) == rootsearch(b) || rootsearch(a + n) == rootsearch(b + n))//检查是否是同性恋
            {
                flag = 1;
            }
            else
            {
                pre[rootsearch(a)] = pre[rootsearch(b + n)];//a和b+n交往
                pre[rootsearch(b)] = pre[rootsearch(a + n)];//b和a+n交往
            }
        }
        printf("Scenario #%d:\n", Case++);
        if (flag)
            printf("Suspicious bugs found!\n");
        else
            printf("No suspicious bugs found!\n");
        if (T != 0)
            printf("\n");
    }
}

 

上一篇:c++ 炸弹人


下一篇:TensorFlow life的进行图片识别