首页 > 其他分享 >各种并查集

各种并查集

时间:2024-07-21 19:08:47浏览次数:12  
标签:各种 连通性 int 查集 long fa return

并查集学习

普通并查集

用途:维护一个集合的连通性
不用多说,下面的才是重点

扩展域并查集

用途:维护两个以上的集合的连通性。
经典 例题
对于这个题,我们可以把人分成两个域:朋友域(\(1\) ~ \(n\))和敌人域(\(n+1\) ~ \(2n\))

  1. 如果 \(u,v\) 是朋友,直接合并 \(u,v\)。
  2. 如果 \(u,v\) 是敌人,那么 \(u\) 和 \(v\) 映射到敌人域中的 \(v+n\) 一定是朋友,所以合并 \(u\),\(v+n\)。(\(u+v\) 和 \(v\) 同理)
    最后统计一下连通块的个数。
# include <bits/stdc++.h> 
using namespace std; 
typedef long long ll; 
// # define int long long 
# define lc u << 1
# define rc u << 1 | 1 
# define fi first
# define se second
inline int read ()
{
    int w = 1, s = 0;
    char c = getchar ();
    for (; c < '0' || c > '9'; w *= (c == '-') ? -1 : 1, c = getchar ());
    for (; c >= '0' && c <= '9'; s = 10 * s + (c - '0'), c = getchar ());
    return s * w;
}
const int N = 2005;

int n, m;
int fa[N];
int find_fa (int u) { return u == fa[u] ? u : fa[u] = find_fa (fa[u]); }
signed main ()
{
//	freopen ("test.in", "r", stdin);
//	freopen ("test.out", "w", stdout);	
	n = read (), m = read ();
	for (int i = 1; i <= n * 2; i ++ ) fa[i] = i;
	while (m -- )
	{
		char op; int u, v; scanf (" %c%d%d", &op, &u, &v);
		if (op == 'F') fa[find_fa (u)] = find_fa (v);
		else
		{
            fa[find_fa (u + n)] = find_fa (v);
            fa[find_fa (v + n)] = find_fa (u);
        }
    }
    int cnt = 0;
    for (int i = 1; i <= n; i ++ )
    {
    	if (i == fa[i])
    		cnt ++ ;
	}
	printf ("%d\n", cnt);
	return 0;
}

带权并查集

用途:可以在并查集的边上定义某种权值以及这种权值在路径压缩时产生的计算。
一般使用的是 \(d_x\) 表示 \(x\) 到根的距离。

int find_fa (int u)
{
	if (u == fa[u]) return u;
	int v = find_fa (fa[u]);
	d[u] = d[u] + d[fa[u]];
	return fa[u] = v;
}

标签:各种,连通性,int,查集,long,fa,return
From: https://www.cnblogs.com/legendcn/p/18314834

相关文章

  • 并查集跳跃
    $\quad$在解决区间问题时,如果直接修改或者线段树不好维护且总共的有效修改很小时,我们就可以考虑使用并查集来解决问题。$\quad$问题中的各元素需要满足一定的条件,我们在遍历的时候,如果当前元素修改完之后仍然满足条件,那么我们就可以直接跳到后面的位置后面第一个满足条件的位......
  • Autopsy Forensic Browser 是一个开源的数字取证工具,主要用于分析电脑文件系统和存储
    AutopsyForensicBrowser是一个开源的数字取证工具,主要用于分析电脑文件系统和存储设备,帮助调查人员识别和恢复可能的证据。它设计用于在调查和法医实验室中使用,支持各种操作系统,包括Windows、Linux和macOS。该工具的主要特点和功能包括:文件系统分析:可以深入分析和检查存储......
  • 各种快速排序-史诗级巨作
    定义快速排序(英语:Quicksort),又称分区交换排序(英语:partition-exchangesort),简称「快排」,是一种被广泛运用的排序算法。基本原理与实现过程快速排序的工作原理是通过分治的方式来将一个数组排序。快速排序分为三个过程:将数列划分为两部分(要求保证相对大小关系);递归到两个子序......
  • vue用到的各种三方插件的介绍和使用方法
    本篇文章用于自用,有的地方介绍的可能会不清楚,请谨慎观看本文会随着做的项目用到的东西会不断的更新1.@riophae/vue-treeselect@riophae/vue-treeselect是一个基于Vue.js的树形选择组件,用于在用户界面中展示和选择层次结构的数据,是一个树形的下拉菜单下载npminstall......
  • [php命令执行函数]详解各种php命令执行函数
    如下几种命令执行函数:目录systemexcpassthrushell_exec反引号``popensystemsystem函数简介:用于执行命令语法形式:system(string$command,int$return_var=?)command:必选参数,字符类型,被system函数执行的命令,如lsreturn_var:可选参数,整数类型,如果提供此参数,则com......
  • 什么是信息指纹和信息加密——《数学之美》第16、17章以及其他各种资料的读书笔记
    目录1.信息指纹1.1概念1.2相关算法的演进历程1.3 哈希碰撞1.4 雪崩效应1.5 应用场景2.信息加密2.1密码学的简要历史2.1.1古代密码学:智慧的萌芽2.1.2 中世纪至文艺复兴:密码术的兴起2.1.3 近代密码学:机械密码机的诞生2.1.4 现代密码学:复杂科学的诞生2.......
  • 使用Apache POI 处理Miscrosoft Office各种格式文件
    介绍ApachePOI是一个处理MiscrosoftOffice各种文件格式的开源项目。简单来说就是,我们可以使用POI在Java程序中对MiscrosoftOffice各种文件进行读写操作。一般情况下,POI都是用于操作Excel文件。ApachePOI的应用场景:●银行网银系统导出交易明细●各种业务系......
  • 各种图(流程图,思维导图,UML,拓扑图,ER图)简介
    原文链接:https://blog.51cto.com/jiqing9006/3284733流程图1.定义:流程图是对过程、算法、流程的一种图像表示,在技术设计、交流及商业简报等领域有广泛的应用。2.案例  3.计算机语言只是一种工具。光学习语言的规则还不够,最重要的是学会针对各种类型的问题,拟定出有效的解......
  • 【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序
    ✨✨欢迎大家来到景天科技苑✨✨......
  • 03各种概念
    1、BeanDefinition概念(辅助Class概念从而实现spring世界的基石)spring的世界里,把bean的信息(bean与别的bean的关系,bean自身各属性的值)封装到BeanDefinition,这样实例化bean时能更加丰富,有了BeanDefinition就不再是用newInstance方法实例化出一个个光秃秃的对象,而是把对象之间互相......