社区讨论

abc350 D题求助

学术版参与者 7已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@lv85kvx2
此快照首次捕获于
2024/04/20 21:46
2 年前
此快照最后确认于
2024/04/21 07:05
2 年前
查看原帖
并查集做的,有些拙劣,悬个关
CPP
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long f[200005];
int find(int t){
	int tt=t;
	while(f[t]!=t){
		t=f[t];
	}
	return f[tt]=t;
}
long long ans[200005];
long long final;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		f[i]=i;
	}
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		f[find(a)]=find(b);
	}
	for(int i=1;i<=n;i++){
		find(i);
	}
	for(int i=1;i<=n;i++){
		ans[f[i]]++;
	}
	for(int i=1;i<=n;i++){
		if(f[i]==i){
			long long sum=ans[i]*(ans[i]-1)/2;
			final+=sum;
		}
	}
	cout<<(final-m)<<endl;
	return 0;
}

回复

10 条回复,欢迎继续交流。

正在加载回复...