POJ-图论-并查集模板
POJ-图论-并查集模板
1、init:把每一个元素初始化为一个集合,初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身(也可以根据情况而变)。
void init()
{
for (int i = 0; i < n; i++) p[i] = i;//p[i]即为i结点的父亲节点的编号
}
2、find(x) :查找一个元素所在的集合,即找到这个元素所在集合的祖先,判断两个元素是否属于同一集合,只要看他们所在集合的祖先是否相同即可。合并两个集合,也是使一个集合的祖先成为另一个集合的祖先。
int find(int x)
{
return x == p[x] ? x : p[x] = find(p[x]);//已包含路径压缩
}
3、Union(x,y) :合并x,y所在的两个集合,利用find()找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先。如图

void Union(int x, int y)
{
x = find(x);
y = find(y); if (x == y) return;
else p[y] = x;//把y树合并到x树上,以x为根
}
POJ 2524 Ubiquitous Religions
解题思路
并查集入门题,求出有多少个不同的连通分量即可。
AC代码
#include<cstdio>
const int N = ; int p[N];//父结点数组
int n, m;//结点数量和结点关系数量 void init()
{
for (int i = ; i < n; i++)p[i] = i;//初始化,父结点为自身,单结点为孤立树
} int find(int x)//找到x所在树的根结点
{
return (x == p[x]) ? x : p[x] = find(p[x]);
} void Union(int x, int y)//合并,将y树合并到x树上
{
x = find(x);
y = find(y);
if (x == y)return;
else p[y] = x;
} int main()
{
int cnt = ;
while (scanf("%d%d", &n, &m)!=EOF)
{
if (n == && m == ) break;
int x, y;
init();//初始化,清空数组
for (int i = ; i < m; i++)
{
scanf("%d%d", &x, &y);
Union(x, y);
}
int ans = ;
for (int i = ; i < n; i++)
{
if (i == p[i])ans++;
}
printf("Case %d: %d\n", cnt++, ans);
}
return ;
}
POJ 1611 The Suspects
解题思路

至于一个小组有多个人,从第二个人起与第一个人所在小组合并就好。
AC代码
#include<cstdio>
const int N = ; int p[N];//父结点数组
int n, m;//结点数量和结点关系数量 void init()
{
for (int i = ; i < n; i++)p[i] = i;//初始化,父结点为自身,单结点为孤立树
} int find(int x)//找到x所在树的根结点
{
return (x == p[x]) ? x : p[x] = find(p[x]);
} void Union(int x, int y)//合并,将y树合并到x树上
{
x = find(x);
y = find(y);
if (x == y)return;
else p[y] = x;
} int main()
{
while (scanf("%d%d", &n, &m)!=EOF)
{
if (n == && m == ) break;
int groupNum, x, y;
init();//初始化,清空数组
while(m--)
{
scanf("%d%d", &groupNum, &x);
while (--groupNum)
{
scanf("%d", &y);
Union(x, y);//每个组员与第一个组员所在团体合并
}
}
int ans = ;
for (int i = ; i < n; i++)//自己也是患者
{
if (find(i) == find())ans++;//和0号有关系的学生
}
printf("%d\n", ans);
}
return ;
}
POJ-图论-并查集模板的更多相关文章
- HDU 1213 How Many Tables(并查集模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意: 这个问题的一个重要规则是,如果我告诉你A知道B,B知道C,这意味着A,B,C知道对方,所以他们可以 ...
- poj 1984 并查集
题目意思是一个图中,只有上下左右四个方向的边.给出这样的一些边, 求任意指定的2个节点之间的距离. 就是看不懂,怎么破 /* POJ 1984 并查集 */ #include <stdio.h& ...
- 【2018寒假集训Day 8】【并查集】并查集模板
Luogu并查集模板题 #include<cstdio> using namespace std; int z,x,y,n,m,father[10001]; int getfather(i ...
- 【并查集模板】 【洛谷P2978】 【USACO10JAN】下午茶时间
P2978 [USACO10JAN]下午茶时间Tea Time 题目描述 N (1 <= N <= 1000) cows, conveniently numbered 1..N all a ...
- 【并查集模板】并查集模板 luogu-3367
题目描述 简单的并查集模板 输入描述 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1时,将Xi与Yi所在的集合合并 当Zi=2时,输出 ...
- poj 1797(并查集)
http://poj.org/problem?id=1797 题意:就是从第一个城市运货到第n个城市,最多可以一次运多少货. 输入的意思分别为从哪个城市到哪个城市,以及这条路最多可以运多少货物. 思路 ...
- POJ 2492 并查集扩展(判断同性恋问题)
G - A Bug's Life Time Limit:10000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...
- POJ 2492 并查集应用的扩展
A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 28651 Accepted: 9331 Descri ...
- HDU 1213 - How Many Tables - [并查集模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Today is Ignatius' birthday. He invites a lot of ...
随机推荐
- Java 多线程学习扩展
http://www.imooc.com/video/5176 一.如何扩展Java并发知识 Java Memory Mode JMM描述了Java线程如何通过内存进行交互 happens-befor ...
- 关于python Tk中实时的输出.
源码如下: import time from Tkinter import * def run(): while True: txt.insert(END,'...') print '...' tim ...
- swift修饰符
Declaration Modifiers Declaration modifiers are keywords or context-sensitive keywords that modify t ...
- AsciiDoc 的相关整理
Asciidoc Book Editor based on JavaFX 8 Asciidoc FX is a book / document editor to build PDF, Epub, ...
- 利用伪寄存器对MSVC++进行调试的介绍
简介 让我们从我写这篇文章的原因开始.一天,一个同事让我帮他调试他遇到的问题.所以我看着他在输入代码,这时我注意到下面一行: int test = GetLastError(); 他这样做是因为他想知 ...
- three.js 加载3DS 404 文件找不到
web.config修改如下: code: <?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配 ...
- A♂G&C012
A♂G&C012 A AtCoder Group Contest 从大到小sort后输出\(a_2+a_4+a_6+\ldots a_{2n}\) 好♂啊,只会背结论/kk B Splatte ...
- Fluent——UDF监测指定点的物理量
Fluent版本:19.0 Fluent当中提供了监测某一点物理量随迭代次数或者随时间变化的功能,下面我们就介绍如何在UDF当中实现相同的功能,并且UDF更加灵活,通过UDF的方式我们在知道某点运动规 ...
- Linux上DNS解析总是选择resolv.conf中第二位的DNS服务器IP地址
问题现象: 在Linux机器上,用户自建了一台DNS服务器.然后改动/etc/resolv.conf将其服务器IP地址添加到第一项.将阿里云的内网DNS放到第二位,然而在测试过程中发现telnet,p ...
- Java NIO Buffer详解
一.ByteBuffer类型化的put与get方法 /** * ByteBuffer类型化的put与get方法 */ public class NioTest5 { public static voi ...