并查集 poj1611&poj2492】的更多相关文章

poj1611 简单题 代码中id记录父节点,sz记录子树规模.一个集合为一棵树. #include <iostream> #include <cstdio> using namespace std; int id[300005]; int sz[300005]; void add(int a, int b) { int i, j; for (i = a; i != id[i]; i = id[i]); for (j = b; j != id[b]; j = id[j]); if…
传送门:The Suspects 并查集水题 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 50005; int n,m; int a[maxn],b,ans; int pre[maxn]; void init() { for(int i=0;i<n;i++){ pre[i] = i; } } int findPre(…
转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基础并查集★1325&&poj1308 Is It A Tree? 基础并查集★1856 More is better 基础并查集★1102 Constructing Roads 基础最小生成树★1232 畅通工程 基础并查集★2120 Ice_cream's world I 基础并查集★212…
题目链接 http://poj.org/problem?id=2492 题意 虫子有两种性别,有n只虫子,编号1~n,输入m组数据,每组数据包含a.b两只虫子,表示a.b为不同性别的虫子,根据输入的m组数据是否出现前后矛盾(如a.b在前面判断为同性,而后又得出a.b为异性)进行相应的输出. 思路 使用并查集求解,但该题比普通并查集题目复杂了一些,该题需要使用树中结点的权值来记录信息,在代码中使用数组r[]来记录某结点和其父结点之间的性别是否相同,若r[x]=0,则说明虫子x和其父结点同性,若r[…
题目链接 http://poj.org/problem?id=1611 题意 有n个学生,编号0~n-1,m个社团,每个社团有k个学生,如果社团里有1个学生是SARS的疑似患者,则该社团所有人都要被隔离.起初学生0是疑似患者,求要隔离多少人. 思路 使用并查集求解. 代码 #include <iostream> #include <cstring> #include <cstdio> using namespace std; + ; int p[N]; void mak…
题目链接: http://poj.org/problem?id=2492 题意: 有t组测试数据, 对于每组数据,第一行n, m分别表示昆虫的数目和接下来m行x, y, x, y表示教授判断x, y为异性, 问教授是否有错误判断,即存在x, y为同性; 这道题和poj1703类似, 不过更简单一点 (poj1703题解) 解法1: 我们可以用rank[x]记录x与其父亲节点的关系, rank[x]=0表同性, rank[x]=1表异性; 假设前面的教授判断都是正确的, 若后面存在与前面判断矛盾的…
题目链接:http://poj.org/problem?id=1611 题意: SARS(非典型肺炎)传播得非常厉害,其中最有效的办法是隔离那些患病.和患病者接触的人.现在有几个学习小组,每小组有几个学生,一个学生可能会参加多个小组.小组中只要有一个人得病,其余的都是嫌疑人.现在已知这些小组的人员,且已知0号学生是患病嫌疑人,求一共有多少个嫌疑人. 思路:用并查集按组合并,然后遍历一遍,0号学生祖先相同则计数加一: 注意:此题数据比较大,要压缩路径,不然会超时: 代码: #include <io…
http://poj.org/problem?id=1611 题目大意: 有一个学校,有N个学生,编号为0-N-1,现在0号学生感染了非典,凡是和0在一个社团的人就会感染,并且这些人如果还参加了别的社团,他所在的社团照样全部感染,求感染的人数. 解题思路: 并查集的变种,实质就是求0所在的强连通图的结点数目. 这道题纠结在数据的输入上,他只是告诉你哪些学生是同一个社团的.这就需要处理一下,我的想法是:如果这个社团有num个孩子,new出一个大小为num的数组,第一个孩子不处理,从第二个孩子起,和…
题意:研究一种生物,有n个生物个体,发现有一些之间进行了交配,给出了这些关系,问是否有同性恋的bug出现. 用0\1表示某元素和其祖先元素的性别关系,0 为相同,1 为不同,用 mod2 实现累计处理,这样就能直接用并查集做了. #include<stdio.h> #include<string.h> ],n,m,num[]; void init(){ ;i<=n;i++)fa[i]=i; memset(num,,sizeof(num)); } int find(int x)…
题意:病毒蔓延,现在有 n 个人,其中 0 号被认为可能感染,然后给出多个社交圈,如果某个社交圈里有人被认为可能被感染,那么所有这个社交圈里的人都被认为可能被感染,现在问有多少人可能被感染. 带权并查集,给每个集合加入这个集合的总人数,合并集合是一起合并就可以了. #include<iostream> #include<cstdio> #include<cstring> using namespace std; ],num[]; void init(){ ;i<n…