站外题求助
  • 板块学术版
  • 楼主cygnus_beta
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/7/14 11:58
  • 上次更新2023/11/4 14:50:26
查看原帖
站外题求助
452531
cygnus_beta楼主2021/7/14 11:58

本校OJ的题目,并查集相关

时间复杂度O(n2)O(n^2)但是平均时间20ms,so不是时间复杂度的问题

求助

代码如下:

#include<iostream>
using namespace std;

int n,m,p,x,y,cnt;

int find(int* fa,int n){
	if(fa[n]==n)return n;
	return fa[n]=find(fa,fa[n]);
}

void merge(int* fa,int a,int b){
	a=find(fa,a),b=find(fa,b);
	fa[b]=a;
}

int main(){
	cin>>n>>m;
	int fa[n+5];
	int di[n+5];
	for(int i=1;i<=n;i++)fa[i]=i;
	for(auto& i:di)i=0;
	for(int i=0;i<m;i++){
		cin>>p>>x>>y;
		switch(p){
		case 0:
			merge(fa,x,y);
			break;
		case 1:
			di[x]=y;
			di[y]=x;
			break;
		default:
			break;
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++){
			if(di[find(fa,i)] and di[find(fa,i)]==di[find(fa,j)])merge(fa,i,j);
		}
	for(int i=1;i<=n;i++)if(fa[i]==i)cnt++;
	cout<<cnt;

	return 0;
}
2021/7/14 11:58
加载中...