题解:SP131 SQDANCE - Square dance
题目传送门。
什么逆天翻译。翻译成了并查集板子。
如果所有点已经成了一个连通块,再加一条边一定会成为环。
这里稍微介绍一下并查集。
在初始时,我们把每一个点的祖先都设为自己;在合并时,我们只需要将一个祖先的祖先由自己改为另一个祖先;在查询时,只需查询两个点的祖先是否相同。
#include<bits/stdc++.h>
using namespace std;
int fa[100001],T,n,m,x,y;
int findd(int xx){
	if(fa[xx]==xx)return xx;
	return fa[xx]=findd(fa[xx]);
}//查询祖先
void vnion(int xx,int yy){
	fa[findd(xx)]=fa[findd(yy)];
}//合并,因为 union 是关键字,这里写成 vnion
int main(){
	cin>>T;
	while(T--){
		cin>>n>>m;
		for(int i=1;i<=n;i++)fa[i]=i;
		int cnt=0;
		for(int i=1;i<=m;i++){
			cin>>x>>y;
			if(findd(x)!=findd(y)){
				vnion(x,y);
			}//不在一起:合并
			else cnt++;
		}
		cout<<cnt;
		cout<<endl;
	}
	return 0;
} 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号