并查集 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 (i == j) return;
if (sz[i] < sz[j]) {
id[i] = j;
sz[j] += sz[i];
} else {
id[j] = i;
sz[i] += sz[j];
}
} int main()
{
int n, m, cnt, root, temp;
while (scanf("%d%d", &n, &m) != EOF) {
if (!n) break;
for (int i = 0; i < n; ++i) {
id[i] = i;
sz[i] = 1;
}
for (int i = 0; i < m; ++i) {
scanf("%d", &cnt);
scanf("%d", &root);
for (int j = 1; j < cnt; ++j) {
scanf("%d", &temp);
add(root, temp);
}
}
int ans = 0;
int rt;
for (rt = 0; rt != id[rt]; rt = id[rt]);
for (int i = 0; i < n; ++i) {
int j;
for (j = i; j != id[j]; j = id[j]);
if (j == rt) ++ans;
}
printf("%d\n", ans);
}
return 0;
}
poj 2492
题目也是醉了,看半天没看懂= =#
输入每对a b表示a和b是夫妻,问有没有同性恋= =
把每一次a b放入同一集合,并用rel记录每个节点和它父节点的相对关系。这样同一集合的任意两点间关系就确定了
/**********************************************
Memory: 8500 KB Time: 125 MS
Language: G++ Result: Accepted
***********************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int id[2010], sz[2010];
int a[1000005], b[1000005];
int rel[2010]; //和父节点的性别是否一致,一致为0,否则为1 int Scan() { //输入外挂
int res = 0, flag = 0;
char ch;
if((ch = getchar()) == '-') flag = 1;
else if(ch >= '0' && ch <= '9') res = ch - '0';
while((ch = getchar()) >= '0' && ch <= '9')
res = res * 10 + (ch - '0');
return flag ? -res : res;
} void add(int a, int b)
{
int i, j;
int rel_a = 0, rel_b = 0;
for (i = a; i != id[i]; i = id[i])
rel_a = (rel_a + rel[i]) % 2; //a和根节点的关系
for (j = b; j != id[j]; j = id[j])
rel_b = (rel_b + rel[j]) % 2; //b和根节点的关系
if (i == j) return ;
if (sz[i] <= sz[j]) { //i->j
sz[j] += sz[i];
id[i] = j;
rel[i] = (rel_a == rel_b) ? 1 : 0; } else { //j->i
sz[i] += sz[j];
id[j] = i;
rel[j] = (rel_a == rel_b) ? 1 : 0;
}
} int is_gay(int a, int b)
{
int i, j;
int rel_a = 0, rel_b = 0;
for (i = a; i != id[i]; i = id[i])
rel_a = (rel_a + rel[i]) % 2;
for (j = b; j != id[j]; j = id[j])
rel_b = (rel_b + rel[j]) % 2;
if (i == j && rel_a == rel_b)
return 1;
return 0;
} int main()
{
int t, m, n;
t = Scan();
for (int k = 1; k <= t; ++k) {
n = Scan();
m = Scan();
for (int i = 1; i <= n; ++i) {
id[i] = i;
sz[i] = 1;
rel[i] = 0;
}
for (int i = 0; i < m; ++i) {
a[i] = Scan();
b[i] = Scan();
add(a[i], b[i]);
}
int i;
for (i = 0; i < m; ++i) {
if (is_gay(a[i], b[i]))
break;
}
printf("Scenario #%d:\n%s\n\n", k, i == m ? "No suspicious bugs found!" : "Suspicious bugs found!");
}
return 0;
}
总结经验教训:以后多敲两行也不能复制粘贴= =太坑。。。
并查集 poj1611&poj2492的更多相关文章
- 并查集——poj1611(入门)
传送门:The Suspects 并查集水题 #include <iostream> #include <cstdio> #include <algorithm> ...
- 【转】并查集&MST题集
转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...
- poj2492 A Bug's Life(带权并查集)
题目链接 http://poj.org/problem?id=2492 题意 虫子有两种性别,有n只虫子,编号1~n,输入m组数据,每组数据包含a.b两只虫子,表示a.b为不同性别的虫子,根据输入的m ...
- poj1611 The Suspects(并查集)
题目链接 http://poj.org/problem?id=1611 题意 有n个学生,编号0~n-1,m个社团,每个社团有k个学生,如果社团里有1个学生是SARS的疑似患者,则该社团所有人都要被隔 ...
- poj2492(种类并查集/各种解法)
题目链接: http://poj.org/problem?id=2492 题意: 有t组测试数据, 对于每组数据,第一行n, m分别表示昆虫的数目和接下来m行x, y, x, y表示教授判断x, y为 ...
- poj1611(并查集)
题目链接:http://poj.org/problem?id=1611 题意: SARS(非典型肺炎)传播得非常厉害,其中最有效的办法是隔离那些患病.和患病者接触的人.现在有几个学习小组,每小组有几个 ...
- poj1611 并查集 (路径不压缩)
http://poj.org/problem?id=1611 题目大意: 有一个学校,有N个学生,编号为0-N-1,现在0号学生感染了非典,凡是和0在一个社团的人就会感染,并且这些人如果还参加了别的社 ...
- poj2492 带权并查集
题意:研究一种生物,有n个生物个体,发现有一些之间进行了交配,给出了这些关系,问是否有同性恋的bug出现. 用0\1表示某元素和其祖先元素的性别关系,0 为相同,1 为不同,用 mod2 实现累计处理 ...
- poj1611 带权并查集
题意:病毒蔓延,现在有 n 个人,其中 0 号被认为可能感染,然后给出多个社交圈,如果某个社交圈里有人被认为可能被感染,那么所有这个社交圈里的人都被认为可能被感染,现在问有多少人可能被感染. 带权并查 ...
随机推荐
- 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait ...
- mvvm windows app DataBinding
前台html 绑定(view):<div id="aa" data-win-bind="innerText:UserData.word" style=&q ...
- 使用KVC
KVC是Key Value Coding的简称,意思是键值编码,号称Cocoa的大招.它是一种可以直接通过字符串key(对象在名称)来访问或修改对象属性的机制. 使用 1.利用KVC可以随意修改一个对 ...
- JavaScript原生错误及检测
JavaScript代码在运行时可能产生的错误共有六种类型: 语法错误 类型错误 范围错误 eval错误 引用错误 URI错误 使用try-catch语句检测错误类型 try{ }catch(erro ...
- bzoj 3672: [Noi2014]购票 树链剖分+维护凸包
3672: [Noi2014]购票 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 480 Solved: 212[Submit][Status][D ...
- 日均百万 PV 的站点如何做性能监测?试试「3M口罩」!
对很多开发者而言,如果网站的日流量达到百万级别,峰值 PV 也突破了 3 万,这样的站点在线下测试的时候总是让人心力交瘁.... 生产环境下的性能监测问题更是尤其让人头疼! 开发同学在想,运维人员也在 ...
- IDEA如何打包可运行jar的一个问题。
转自http://bglmmz.iteye.com/blog/2058785 背景: 有时候,我们会用IDEA来开发一些小工具,需要打成可运行的JAR包:或者某些项目不是WEB应用,纯粹是后台应用,发 ...
- 第五章 HID设备
5.1 HID介绍 为简化USB设备的开发过程,USB提出了设备类的概念.所有设备类都必须支持标准USB描述符和标准USB设备请求.如果有必要,设备类还可以自行定义其专用的描述符和设备请求,这分别被称 ...
- 这些小众软件让你的效率提升N倍!(必备,收藏)
大部分的我们,电脑买来之后,软件越装越多,电脑越来越卡,导致工作的效率也是越来越低. 同时还可能长期处于软件安装完又卸载的无限恶性循环中.提高工作效率是我们利用电脑办公的一大优势,安装好的软件更是可以 ...
- Android 如何在Java代码中手动设置控件的marginleft
1.定义LayoutParams LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.La ...