A Bug's Life(带权并查集)POJ - 2492
Posted whhh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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: ", Case++); if (flag) printf("Suspicious bugs found! "); else printf("No suspicious bugs found! "); if (T != 0) printf(" "); } }
以上是关于A Bug's Life(带权并查集)POJ - 2492的主要内容,如果未能解决你的问题,请参考以下文章
带权并查集(含种类并查集)经典模板 例题:①POJ 1182 食物链(经典)②HDU - 1829 A bug's life(简单) ③hihoCoder 1515 : 分数调查(示例代码(代