本来是在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;
}