并查集

主要解决图的连通性问题,比如:

  1、随意给你两个点,让你判断它们是否连通;

  2、问你整幅图一共有几个连通分支;

初始化:

void init(int size)
{
for(int i = ; i < size; i++) pre[i] = i;
}

代码(非递归):

int find(int x)           //查找根节点
{
int r = x;
while(pre[r] != r) r = pre[r]; //返回根节点 r int i = x , j ;
while(i != r) //路径压缩
{
j = pre[i]; // 在改变上级之前用临时变量 j 记录下他的值
pre[i] = r ; //把上级改为根节点
i = j;
}
return r ;
} void join(int x,int y) //判断x y是否连通
{
int fx = find(x);
int fy = find(y); if(fx != fy) //如果已经连通,就不用管了; 如果不连通,就把它们所在的连通分支合并起
pre[fx]=fy;
}

递归法:

int find(int x)
{
if (x != pre[x])
pre[x] = find(pre[x]); return pre[x];
}  

求连接非连通图,需要几条边:

#include <iostream>
using namespace std; int N, E, Answer;
int pre[]; int find(int x)
{
int r = x; while(pre[r] != r) //找父亲
r = pre[r]; int i = x, j;
while(i != r) //路径压缩
{
j = pre[i];
pre[i] = r;
i = j;
} return r;
} int find2(int x) //递归
{
if (x != pre[x])
pre[x] = find(pre[x]);
return pre[x];
} int main()
{
int x, y, p1, p2;
while(cin >> N, N) //顶点数
{
Answer = N-; //N个顶点需要N-1条边
for(int i = ; i <= N; i++)
        pre[i] = i; //每个顶点的父亲都是自己 cin >> E; //边数
while(E--)
{
cin >> p1 >> p2;
x = find(p1);
y = find(p2); if(x != y) //如果是不连通的,把这两个分支连起来, 分支的总数就减少了1,还需建的路也就减了1
{
pre[y]=x;
Answer--;
}
//如果两点已经连通了,那么这条路只是在图上增加了一个环 //对连通性没有任何影响,无视掉
}
cout << Answer << endl; //最后输出还要修的路条数
}
}

输入:


Algorithm --> 并查集的更多相关文章

  1. POJ 2524 并查集

    Ubiquitous Religions Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 23580 Accepted: 1160 ...

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

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

  3. 并查集类的c++封装,比較union_find algorithm四种实现方法之间的性能区别

    问题描写叙述: 在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(union-find algorithm ...

  4. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  5. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  6. “玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)

    题意:初始时有个首都1,有n个操作 +V表示有一个新的城市连接到了V号城市 -V表示V号城市断开了连接,同时V的子城市也会断开连接 每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号 ...

  7. 并查集补集作法 codevs 1069 关押罪犯

    1069 关押罪犯 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description ...

  8. hdu 5652 India and China Origins 并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题目大意:n*m的矩阵上,0为平原,1为山.q个询问,第i个询问给定坐标xi,yi,表示i年后这 ...

  9. POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8807   Accepted ...

随机推荐

  1. 【javascript】jquery jsonp跨越请求

    <html> <head> <meta charset="utf-8"> <title></title> <scr ...

  2. Java中用正则表达式判断日期格式是否正确

    1.Java中用正则表达式判断日期格式是否正确 DateType.java: /** * @Title:DateType.java * @Package:com.you.dao * @Descript ...

  3. CAN控制器-配置过滤器

    首先简单介绍一下CAN总线,关于CAN总线是谁发明的,CAN总线的历史,CAN总线的发展,CAN总线的应用场合,这些,通通不说.这里只是以我个人理解,简单说说CAN通信.CAN总线的端点没有地址(除非 ...

  4. 神经网络ANN——SPSS实现

    神经网络[] 一.起源与历史 1.与传统统计方法的区别 传统线性回归模型可通过最小平方方法获取知识并在回归系数存储知识.在此意义下,其为神经网络.实际上,您可以证明线性回归为特定神经网络的特殊个案.但 ...

  5. JSP标签c:forEach实例

    JSP标签c:forEach实例 1.实例源码 <%@ page language="java" import="java.util.*" pageEnc ...

  6. 提取DirectShow中视频采集的数据

    DirectShow中,数据流(Data Flow)都是依次流过各个Filter的.它对数据的管理也有自己的方法,而且并没有向用户提供一个统一的接口,供用户操作数据流.这里以提取视频采集在的每帧为位图 ...

  7. ASP.NET CORE入门之读取Json配置文件

    首先新建一.net core控制台项目,命名为jsonReader 然后选中引用,选择NuGet包管理器,点击浏览引入mircosoft.aspnetcore.all并安装 选中解决方案,填加,新建项 ...

  8. poj3268(置换矩阵思想)

    题意:一群牛分别从1~n号农场赶往x号农场参加聚会,农场与农场之间的路时单向的,在n个农场之间有m条路,给出 a ,b , t表示从a号农场到b号农场需要t时间. 每头牛都会选择最短的路,问来回路上( ...

  9. 【NOIP2004】【CJOJ1703】【洛谷1092】虫食算

    题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 ...

  10. 平面图转对偶图(Bzoj1001:狼抓兔子)

    如果只会用最小割做这道题那就太菜辣 引入 来自某学长 平面图:在平面上边不相交的图(边可以绕着画) 那么平面图的边与边就围成了许多个区域(这与你画图的方式有关) 定义对偶图:把相邻的两个区域连上边,形 ...