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 ...
随机推荐
- JSP中EL表达式的比较符号、字符串比较
在EL表达式中我们可以使用运算符以达到我们想要的结果,运算符按作用分为以下几种: 1.算术运算符 + 例如:${6+6} .注意:在EL表达式中的‘+’只有数学运算的功能,没有连接符的功能,它会试着 ...
- js的原型与模板类型
原型处于复用(原型)链上: 模版类型属于构造概念: 对象复用原型的数据和函数: 对象由模版类型+原型构造而成: 模版类型属于构造对象的临时变量,包含了对象空间的所有信息: 原型包含了对象所引用的原型空 ...
- 【HTTP】另类的POST头数据 RFC1867协议格式简析
http://blog.csdn.net/ai2000ai/article/details/52161979 昨天在实战表单模拟提交的时候,有发现在提交某个表单的时候,页面(discuz!论坛)报错, ...
- Dockerfile介绍、Docker制作jdk镜像
Dockerfile介绍.Docker制作jdk镜像 目标 1.Dockerfile简介 2.Docker制作jdk镜像 Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用 ...
- rushjs来自微软的单体仓库管理工具
rushjs 是来自微软的单体仓库管理工具 ,与lerna 类似但是使用上稍显复杂 安装 npm install -g @microsoft/rush 简单使用 一个传统的基于npm 的处理 ~$ ...
- 服务器使用bbr加速配置
服务器内核升级: 以centos7为例,配置之前可使用以下命令查看内核版本,若是4.0以上则无需对内核升级: uname -r 对内核升级的方法: 直接使用以下命令进行内核版本的下载: rpm --i ...
- linux高性能服务器编程 (八) --高性能服务器程序框架
第八章 高性能服务器编程框架 这一章主要介绍服务器的三个主要模块: I/O处理单元.逻辑单元.存储单元.另外服务器的模型有:C/S模型和P2P模型.虽然服务器模型比较多,但是其核心框架都一样,只是在于 ...
- linux高性能服务器编程 (四) --TCP/IP通信案例
第四章 TCP/IP通信案例 HTTP代理服务器的大致工作原理 在HTTP通信链上,客户端和服务器之间通常存在某些中转代理服务器.它们提供对目标资源的中转访问.一个HTTP请求可能被多个 ...
- 【cf比赛记录】Codeforces Round #600 (Div. 2)
Codeforces Round #600 (Div. 2) ---- 比赛传送门 昨晚成绩还好,AC A,B题,还能上分(到底有多菜) 补了C.D题,因为昨晚对C.D题已经有想法了,所以补起题来也快 ...
- dplyr
The d is for dataframes, the plyr is to evoke pliers. Pronounce however you like. dplyr包可用于处理 R 内部或者 ...