博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并查集 - 优化
阅读量:5161 次
发布时间:2019-06-13

本文共 1001 字,大约阅读时间需要 3 分钟。

2017-07-28 17:27:41

writer:pprp

有两种优化方法:

  1. 路径压缩,在初始化某节点至根节点的路径后,将这条路径上所有的节点都设为根节点,这样将复杂度降为最低;
  2. 启发式合并,在合并两个结合的时候,将节点少的树合并到节点多的树上,也可以将高度小的树合并到高度大的树上;

题目:亲戚


代码如下:

#include 
using namespace std;int N,M,Q;int parent[1000];int Find(int x) //判断x所属集合{ int root = x; while(parent[root]>=0) //找到根节点 root = parent[root]; while(root!=x) //压缩路径,将该点直接 { int tmp = parent[x]; parent[x]= root; x = tmp; } return root;}void Merge(int a,int b) //较小的树成为较大的树的子树{ int pa = Find(a); int pb = Find(b); if(pb < pa) swap(pb,pa); if(pa!=pb) parent[pb] = pa;}int main(){ int i,a,b; cin >> N >> M >> Q; for(i=1; i<=N; i++) { parent[i] = -1; } for(i=1; i<=M; i++) { cin >> a >> b; if(Find(a)!=Find(b)) Merge(a,b); } for(i=1; i<=Q; i++) { cin >> a >> b; if(Find(a)==Find(b)) cout <<"Yes"<

 

转载于:https://www.cnblogs.com/pprp/p/7252339.html

你可能感兴趣的文章
软件架构阅读笔记16
查看>>
iOS 界面元素尺寸
查看>>
mysql锁文章
查看>>
JMeter - 后处理器/脚本语言 - 比较
查看>>
New Chapter有机减肥保健品 $25.26
查看>>
进程与线程
查看>>
NOI2018 冒泡排序规律证明
查看>>
java常用代码(随时更新)
查看>>
firefox与ie 的javascript区别
查看>>
mysql 批量插入500W 测试
查看>>
BZOJ3252: 攻略
查看>>
android源码GIT下载
查看>>
ASP.NET管道
查看>>
Google Chrome 源码下载地址 (Google Chrome Source Code Download)
查看>>
Cowboy 源码分析(七)
查看>>
poj1151 Atlanis 线段树+离散化求矩形面积的并
查看>>
元胞数组的索引
查看>>
6月份值得一看的 Java 技术干货!
查看>>
大龄屌丝自学笔记--Java零基础到菜鸟--033
查看>>
关于初学者上传文件到github的方法
查看>>