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-图论-并查集模板的更多相关文章

  1. HDU 1213 How Many Tables(并查集模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意: 这个问题的一个重要规则是,如果我告诉你A知道B,B知道C,这意味着A,B,C知道对方,所以他们可以 ...

  2. poj 1984 并查集

    题目意思是一个图中,只有上下左右四个方向的边.给出这样的一些边, 求任意指定的2个节点之间的距离. 就是看不懂,怎么破 /* POJ 1984 并查集 */ #include <stdio.h& ...

  3. 【2018寒假集训Day 8】【并查集】并查集模板

    Luogu并查集模板题 #include<cstdio> using namespace std; int z,x,y,n,m,father[10001]; int getfather(i ...

  4. 【并查集模板】 【洛谷P2978】 【USACO10JAN】下午茶时间

    P2978 [USACO10JAN]下午茶时间Tea Time 题目描述 N (1 <= N <= 1000) cows, conveniently numbered 1..N all a ...

  5. 【并查集模板】并查集模板 luogu-3367

    题目描述 简单的并查集模板 输入描述 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1时,将Xi与Yi所在的集合合并 当Zi=2时,输出 ...

  6. poj 1797(并查集)

    http://poj.org/problem?id=1797 题意:就是从第一个城市运货到第n个城市,最多可以一次运多少货. 输入的意思分别为从哪个城市到哪个城市,以及这条路最多可以运多少货物. 思路 ...

  7. POJ 2492 并查集扩展(判断同性恋问题)

    G - A Bug's Life Time Limit:10000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S ...

  8. POJ 2492 并查集应用的扩展

    A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 28651 Accepted: 9331 Descri ...

  9. HDU 1213 - How Many Tables - [并查集模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Today is Ignatius' birthday. He invites a lot of ...

随机推荐

  1. python面试题&练习题之函数

    1.写函数,接收两个数字参数,返回最大值例如:传入:10,20返回:20 def res_max(number1,number2): l1 = [] l1.append(number1) l1.app ...

  2. 为知笔记docker 版本运行

    最近为知提供了服务端的docker 运行,因为是全家桶,镜像偏大,但是使用还很不错,对于少于5人的可以免费使用 docker-compose 文件 version: "3" ser ...

  3. vcenter监控

    在vcenter上配置好用户名密码和url即可使用自动发现自动发现vmware

  4. HDU 4828 小明系列故事——捉迷藏

    漂亮妹子点击就送:http://acm.hdu.edu.cn/showproblem.php?pid=4528 Time Limit: 500/200 MS (Java/Others)    Memo ...

  5. 假设检验总结以及如何用python进行假设检验(scipy)

    几种常见的假设检验总结如下: 假设检验名称 Z检验 t检验 χ2检验 F检验 原假设 H0: μ≥μ0        H0: μ≤μ0        H0: μ=μ0  (比较样本和总体均值)     ...

  6. request登录案例

    一.案例需求 1.编写login.html登录页面 username & password 两个输入框 2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表 3.使 ...

  7. 利用python爬虫爬取图片并且制作马赛克拼图

    想在妹子生日送妹子一张用零食(或者食物类好看的图片)拼成的马赛克拼图,因此探索了一番= =. 首先需要一个软件来制作马赛克拼图,这里使用Foto-Mosaik-Edda(网上也有在线制作的网站,但是我 ...

  8. SpringBoot上传文件到本服务器 目录与jar包同级问题

    目录 前言 原因 实现 不要忘记 最后的封装 Follow up   前言 看标题好像很简单的样子,但是针对使用jar包发布SpringBoot项目就不一样了.当你使用tomcat发布项目的时候,上传 ...

  9. [技术博客]使用PanResponder实现响应左右滑动手势

    在实现用户左右滑动完成不同操作时,使用react-native的官方API--PanResponder响应用户手势操作. PanResponder介绍 PanResponder中文文档 PanResp ...

  10. Spring(二十三):Spring自动注入的实现方式

    注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解包含:Autowrired/Resource/Qualifier/Service/Controller/Repository/C ...