并查集

题意

给你n,m表示n给人,m条线索(谁的boss是谁),问你最后有多少个帮派

代码

#include<bits/stdc++.h>
using namespace std;
int f[10000];

void init(int n){
	for(int i=1;i<=n;i++)
	f[i]=i;
}

int getf(int v){//寻找boss 
	if(f[v]==v) return v;
	else{
		f[v]=getf(f[v]);
		return f[v];
	}
}
void merge(int u,int v){//合并有相同性质的,靠左原则 
	int t1=getf(u);
	int t2=getf(v);
	if(t1!=t2){
		f[t2]=t1;
	}
}

int main(){
	int n,m,a,b;
	while(cin>>n>>m){
		init(n);
		int sum=0;
		for(int i=1;i<=m;i++)
		{
			cin>>a>>b;
			merge(a,b);
		}
		for(int i=1;i<=n;i++)
		{
			cout<<f[i]<<' ';
			if(f[i]==i) sum++;
		}
		cout<<endl;
		cout<<sum<<endl;
	}
	return 0;
} 
posted @ 2018-10-08 19:30  ChunhaoMo  阅读(101)  评论(0编辑  收藏  举报