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. Easy-Mock模拟get接口和post接口实例

    1.先创建项目,再新建接口 创建项目入口:首页右下角 + 按钮 创建接口入口如下图: 关于mock的语法这里不做说明,可查看mock.js官方查看更详情的资料. 小tip:在Easy-Mock里面支持 ...

  2. windows node版本管理工具nvm

    有时候,不同的项目需要使用不同的node版本.我们可以使用nvm管理不同的node版本.具体使用方法如下: 1.下载安装nvm 点击我下载nvm 解压下载的文件,双击nvm-setup.exe 直接下 ...

  3. day39线程

    复习: C/S架构: 客户端     服务器模式 B/S架构: 浏览器     服务器模式 B/S架构的客户端对PC机的性能要求比较低.统一了应用的接口 B/S架构隶属于C/S架构 TCP UDP的区 ...

  4. 华三IRF配置

    配置步骤: IRF的配置步骤: 1.配置IRF域(域ID=10.成员ID.优先级) irf domain 10irf member 1 priority 10irf member 2 priority ...

  5. 使用grok exporter 做为log 与prometheus 的桥

    grok 是一个工具,可以用来解析非结构化的日志文件,可以使其结构化,同时方便查询,grok 被logstash 大量依赖 同时社区也提供了一个prometheus 的exporter 可以方便的进行 ...

  6. 【数论】[素数筛,phi]P3601签到题

    题目描述 给出l,r,要求求出\(\sum_{i = l}^r (i - phi[i]) mod 666623333\) \(1\leq l\leq r\leq 10^{12}\),\(r - l \ ...

  7. OpenVSwitch

    参考: https://opengers.github.io/openstack/openstack-base-use-openvswitch/ 这篇原理部分就不贴出来了,请自行参考上文,并根据自行实 ...

  8. 小程序支持原生async方法

    下载最新版本的微信开发工具,社区链接https://developers.weixin.qq.com/community/develop/doc/00066877c54eb0ff5488b54885b ...

  9. 倍增&矩阵乘法 专题复习

    倍增&矩阵乘法 专题复习 PreWords 这两个基础算法我就不多说啦,但是还是要介绍一下" 广义矩阵 "乘法 其实就是把矩阵换成取\(max\),然后都一样... 据神仙 ...

  10. 【Beta】Scrum meeting 7

    目录 写在前面 进度情况 任务进度表 Beta-1阶段燃尽图 遇到的困难 照片 commit截图记录 后端代码仓库 技术博客 写在前面 例会时间:5.11 22:30-22:50 例会地点:微信群语音 ...