pku 1308 并查集应用

  本来是在hdu 1272上面做,可不知道怎么了,我要hdu上面提交的时候它说我的栈爆了,我就蛋疼了,这怎么可能爆,后来同学告诉我pku上面有一题一样的,我就去交了

结果是没过不过也没有传说中的爆栈这回事,后来发现考虑少了一些东西,改完后,还真过了,这时我就无语了,是我的问题还是hdu的问题?


说到用并查庥来做,一开始我是没什么想法的说,还有有一点很奇怪的是,我看别人的代码都是用很多个数组做(有些加个深度的结点,这我懂),怎么我做了几题都是用1个数组搞定的呢?


哎~~~~说多了, 这题比起一般的并查集应该就是加一个判成环的东西,当前进来的两个结点在树中有着相同的根结点,这时就成环了。

代码:

#include<iostream>
#include<set>

using namespace std;

int father[100005];

int find_father(int& x){
	if(x == father[x]){
		return x;
	}
	else{
		father[x] = find_father(father[x]);
	}
	return father[x];
}

void merage(int&a,int&b){
	father[a] = b;
}
inline void init(){
	for(int i = 0;i <= 100000;i++){
				father[i] = i;
	}
}

int main()
{
	int a,b;
	bool flag;
	set<int> elem;
	init();
	flag = true;
	int walk = 0;
	while(cin >>a >>b &&(a >= 0 && b >= 0)){
		if(!a && !b){
			int count = 0;
			set<int>::iterator beg = elem.begin(),end = elem.end();
			for(;beg != end;beg++){
				if(father[*beg] == *beg)
					count++;
			}
			if(count > 1)
				flag = false;
			if(flag)
				cout <<"Case " <<++walk <<" is a tree." <<endl;
			else
				cout <<"Case " <<++walk <<" is not a tree." <<endl;
			init();
			flag = true;
			elem.clear();
			continue;
		}
		elem.insert(a);
		elem.insert(b);
		int fa = find_father(a);
		int fb = find_father(b);
		if(fa == fb){
			flag = false;
		}
		if(fa != fb){
			merage(fa,fb);
		}
	}
	return 0;
}


你可能感兴趣的:(pku 1308 并查集应用)