算法竞赛备赛——【数据结构】并查集

并查集

普通并查集

注意根据数据大小来开int 或者 long long 否则容易MLE

树的存储结构 双亲表示法------数组 孩子表示法 孩子兄弟表示法

P3367 【模板】并查集 - 洛谷

C++ 复制代码
#include <bits/stdc++.h>
using ll=long long;
using namespace std;
const int N=2e5+5; 

int fa[N];
int n,m;

int find(int x){
	if(x==fa[x])
		return x;
	else return fa[x]=find(fa[x]);
} 
 
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i){
		fa[i]=i;
	}
	for(int i=0;i<m;++i){
		int z,x,y;cin>>z>>x>>y;
		if(z==1){
			//合并
			int fx=find(x);
			int fy=find(y);
			fa[fx]=fy;
		}else{
			//查询 
			int fx=find(x);
			int fy=find(y);
			if(fx==fy) cout<<"Y"<<endl;
			else cout<<"N"<<endl;
		}
	}
	return 0;
}

种类并查集

扩展域并查集 可描述敌对关系

敌人 朋友 没关系 扩展为2n

天敌 同类 猎物 没关系 扩展为3n

P1525 [NOIP 2010 提高组\] 关押罪犯 - 洛谷](https://www.luogu.com.cn/problem/P1525) ```C++ #include using ll=long long; using namespace std; const int N=2e4+2; int f[2*N]; struct enemy{ int a,b,c; }e[100005]; bool cmp(enemy& e1,enemy& e2){ return e1.c>e2.c; } int find(int x){ if(f[x]==x){ return x; } else return f[x]=find(f[x]); } int main(){ int n,m;cin>>n>>m; for(int i=1;i<=2*n;++i){ f[i]=i; } for(int i=1;i<=m;++i){ cin>>e[i].a>>e[i].b>>e[i].c; } sort(e+1,e+m+1,cmp); for(int i=1;i<=m;i++){ int fa=find(e[i].a); int fb=find(e[i].b); int fad=find(e[i].a+n); int fbd=find(e[i].b+n); if(fa==fb){ cout< using ll=long long; using namespace std; const int N=5e4+5; int f[3*N]; int find(int x){ if(f[x]==x){ return x; } else return f[x]=find(f[x]); } int main(){ int n,k;cin>>n>>k; int ans=0; for(int i=1;i<=3*n;++i){ f[i]=i; } while(k--){ int m,x,y; cin>>m>>x>>y; if(x>n||y>n||(m==2&&x==y)){ ans++; continue; } int fx=find(x);//x同类 int fy=find(y);//y同类 int xenemy=find(x+n);//x天敌 int yenemy=find(y+n);//y天敌 int xeat=find(x+2*n);//x猎物 int yeat=find(y+2*n);//y猎物 if(m==1){ if(xenemy==fy||yenemy==fx){ ans++; }else{ f[fx]=fy; f[xenemy]=yenemy; f[xeat]=yeat; } } if(m==2){ if(fx==fy||yeat==fx){ ans++; }else{ f[fy]=xeat; f[yeat]=xenemy; f[yenemy]=fx; } } } cout<

相关推荐
生成论实验室25 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星38 分钟前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
云泽8081 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
科研前沿2 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨2 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
AI进化营-智能译站2 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
晨曦夜月2 小时前
map与unordered_map区别
算法·哈希算法
Morwit2 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
qeen872 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码2 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻