1. 程式人生 > >洛谷p3367 並查集模板

洛谷p3367 並查集模板

%d http scanf 版本 mes 結構 printf urn name

並查集是一種樹型的數據結構,主要用來處理一些不相交集合的合並和更改問題。

技術分享

比如找4的祖先,原來是 4->2->1,通過並查集路徑壓縮後,變為 4->1。也就變成了下圖。

技術分享

並查集的模板題:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int dad[2000001];
int  find(int x)//很簡單的find函數,網上還有while版本的,手懶沒抄= =
{
	return dad[x]==x?x:dad[x]=find(dad[x]);
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i)dad[i]=i;
	for(int i=1;i<=m;++i)
	{
		int x,y,z;
		scanf("%d%d%d",&z,&x,&y);
		int X=find(x);
		int Y=find(y);
		
		if(z==1)
		{
			if(X!=Y) 
			{
				dad[X]=Y;
			}
		}
		else
		{
			if(X==Y) printf("Y\n");
			else printf("N\n");
		}
		
	} 
	return 0;
}

 按秩合並:

x=find(x);
y=find(y)
if(deep[x])>deep[y]) swap(x,y);//保證y的深度一定大於x
dad[x]=y;
deep[y]=max(deep[y],deep[x]+1);

  

洛谷p3367 並查集模板