关于本题的并查集写法
  • 板块P1141 01迷宫
  • 楼主qwq___qaq
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/9/7 23:46
  • 上次更新2023/11/4 07:17:50
查看原帖
关于本题的并查集写法
556362
qwq___qaq楼主2021/9/7 23:46

手打DFS,爆了,于是打了并查集,然后没过样例。

#include<bits/stdc++.h>
using namespace std;
bool p[1005][1005];
int father[100000005],ra[100000005],n,m,x,y,k;
char ch;
void makeSet(int n){
	for(int i=1;i<=n;i++)
		father[i]=i,ra[i]=1;
}
int findSet(int x){
	if(father[x]==x)
		return x;
	else
		return father[x]=findSet(father[x]);
}
void unionSet(int a,int b){
	int x=findSet(a),y=findSet(b);
	if(x!=y){
		father[x]=y;
		ra[y]+=ra[x];
	}
}
int main(){
	scanf("%d%d",&n,&m);
	makeSet(n*n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			cin>>ch;
			p[i][j]=(ch=='1');
			if(i!=1)
				if(p[i][j]!=p[i-1][j])
					unionSet(i*n+j,(i-1)*n+j);
			if(j!=1)
				if(p[i][j]!=p[i][j-1])
					unionSet(i*n+j,i*n+j-1);
			if(i!=n)
				if(p[i][j]!=p[i+1][j])
					unionSet(i*n+j,(i+1)*n+j);
			if(j!=n)
				if(p[i][j]!=p[i][j+1])
					unionSet(i*n+j,i*n+j+1);
		}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		k=findSet(n*x+y);
		printf("%d\n",ra[k]);
	}
	return 0;
}
2021/9/7 23:46
加载中...