空间不知道哪超了,求助
  • 板块学术版
  • 楼主Ysy2027
  • 当前回复6
  • 已保存回复7
  • 发布时间2025/2/7 20:19
  • 上次更新2025/2/8 00:34:02
查看原帖
空间不知道哪超了,求助
1473068
Ysy2027楼主2025/2/7 20:19
#include<bits/stdc++.h>
using namespace std;

int n,m,p1,q,sum=0;
int p[10005],visi[10005],visj[10005];//存该元素的首领 

int findp(int x){
	if(p[x]==0) return x;//该元素没有首领,说明本身即是首领 
	p[x]=findp(p[x]);//否则继续找首领(由于合并时直接接在另一个元素后面,所以要找最终的首领) 
	return p[x];
} 

void hb(int x,int y){
	int px=findp(x);
	int py=findp(y);//找到合并对象的首领 
	if(px==py) return;//首领相同,不做处理 
	p[px]=py; //首领不同,刷新 
}

void cx(int x,int y){
	int px=findp(x);
	int py=findp(y);
	if(px==py){
		sum++;
	}
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
	cin>>n>>m>>p1>>q;
	hb(1,-1);
	for(int i=1;i<=p1;++i){
		int x,y;
		cin>>x>>y;
		hb(x,y);
	}
	for(int i=1;i<=q;++i){
		int x,y;
		cin>>x>>y;
		if(x!=y) hb(x,y);
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			int u=sum;
			if((!visi[i])&&(!visj[j])){
				cx(i,-j);
			    if(sum>u){
				    visi[i]=1;
				    visj[j]=1;
			    }
			}
		}
	}
	cout<<sum;
	return 0;
}
2025/2/7 20:19
加载中...