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

并查集

普通并查集

注意根据数据大小来开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<

相关推荐
呜喵王阿尔萨斯17 分钟前
git命令解析
c++·git
点云SLAM3 小时前
PyTorch 中.backward() 详解使用
人工智能·pytorch·python·深度学习·算法·机器学习·机器人
only-qi4 小时前
146. LRU 缓存
java·算法·缓存
梁辰兴5 小时前
数据结构:排序
数据结构·算法·排序算法·c·插入排序·排序·交换排序
Murphy_lx5 小时前
Lambda表达式
开发语言·c++
yangpipi-5 小时前
C++并发编程-23. 线程间切分任务的方法
开发语言·c++
野犬寒鸦6 小时前
力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
java·数据结构·算法·leetcode·面试
菜鸟得菜6 小时前
leecode kadane算法 解决数组中子数组的最大和,以及环形数组连续子数组的最大和问题
数据结构·算法·leetcode
楼田莉子6 小时前
C++算法专题学习——分治
数据结构·c++·学习·算法·leetcode·排序算法
一支鱼7 小时前
leetcode常用解题方案总结
前端·算法·leetcode