Algorithm --> 并查集
并查集
主要解决图的连通性问题,比如:
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 --> 并查集的更多相关文章
- POJ 2524 并查集
Ubiquitous Religions Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 23580 Accepted: 1160 ...
- POJ 2492 并查集应用的扩展
A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 28651 Accepted: 9331 Descri ...
- 并查集类的c++封装,比較union_find algorithm四种实现方法之间的性能区别
问题描写叙述: 在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(union-find algorithm ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
- “玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)
题意:初始时有个首都1,有n个操作 +V表示有一个新的城市连接到了V号城市 -V表示V号城市断开了连接,同时V的子城市也会断开连接 每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号 ...
- 并查集补集作法 codevs 1069 关押罪犯
1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description ...
- hdu 5652 India and China Origins 并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题目大意:n*m的矩阵上,0为平原,1为山.q个询问,第i个询问给定坐标xi,yi,表示i年后这 ...
- POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8807 Accepted ...
随机推荐
- HI3531的DDR3配置流程
DDR3 初始化配置流程 系统上电之后,必须先完成DDR3 SDRAM 的初始化操作,系统才能访问DDR3 SDRAM.在进行初始化之前需要注意以下几点: 对DDR3 SDRAM 进行上电操作时,需要 ...
- CSS3之background-origin
1.属性简介 background-origin:border|content|padding|!important border:从border区域开始显示背景: content:从content区 ...
- vc++怎么可以直接刷掉MBR?搞笑的吧
FILE * fd=fopen("\\\\.\\PHYSICALDRIVE0","rb+"); char buffer[512]; fread(buffer,5 ...
- nested exception is java.sql.SQLException: IO 错误
1.错误描述 (mx.messaging.messages::ErrorMessage)#0 body = (null) clientId = "18CE3B03-9709-9DA8-763 ...
- Jquery+Json+Handler文件结合应用实例
1.页面script代码-[model数据.字符串] <script type="text/javascript" charset="utf-8" src ...
- Blending, Bootstrap
听林轩田老师的<机器学习技法>,Lecture 7讲到model的blending. 理解了一个之前一直模棱两可的概念:bootstrap. 先说一下什么是blending.在机器学习中, ...
- iOS - IM 即时通讯
1.即时通讯技术 即时通讯(IM:Instant Messaging):又称实时通讯,支持用户在线实时交谈,允许两人或多人使用网络实时的传递文字消息.文件.语音与视频交流. 即时通讯在开发中使用的场景 ...
- mysql5.7安装教程
1, 下载mysql5.7的安装包mysql-5.7.17-winx64.zip,直接解压到安装目录 2, 进入mysql目录,在里面新建data目录 3, 修改mysql的my.ini文件,指定ba ...
- MySQL新建用户与授权
一.登录root用户 [root@iZm5e9gg1p5y1co0usac2cZ webapps] # mysql -uroot -p 二.新建用户 mysql> create user '; ...
- Keras官方中文文档:序贯模型API
Sequential模型接口 如果刚开始学习Sequential模型,请首先移步这里阅读文档,本节内容是Sequential的API和参数介绍. 常用Sequential属性 model.layers ...