POJ 1308 Is It A Tree?

POJ 1308 Is It A Tree?_第1张图片

并查集

开始没有判断是否成环,死循环了好久。

struct node{
	int parent,num;
}tree[MAX];

int vis[MAX]={};
int E,T; //E 节点数, T 指示是否成树。 

void get(int x,int& f){ 
	int r=x,count=0;
	while(r!=tree[r].parent){
		if(count>E) {//避免成环时死循环 
			T=0;break;
		}
		else count++;
		r=tree[r].parent;
	}
	
	f=r;
}


int main(void)
{
	
	
	int a,b,Case=1;
	while(1){
		E=0;memset(vis,0,sizeof(vis));
		
		
		
		
		T=1 ;int cur=0;//表示是树; 
		while(scanf("%d%d",&a,&b)){
			if(a<0&&b<0) goto end2;
			if(!(a||b)) goto end1;
			if(!T) continue;
			if(a==b) {T=0;}
			if(!vis[a]) vis[a]=1,E++,tree[a].parent=a,tree[a].num=1;//初始化
			if(!vis[b]) vis[b]=1,E++,tree[b].parent=b,tree[b].num=1;
			
			int fa,fb;cur=a;
			get(a,fa);get(b,fb);
			if(b==fb){//只要b无父 就 把 b 连到 a 上。
				tree[b].parent=a;
				tree[fa].num+=tree[b].num;//记录以该节点为根的树有多少节点。
				//printf("%d连%d成功\n",a,b);
			}
			else T=0;	
		}
		end1:
		get(cur,cur);//随便找到一个节点的根节点
		
		if(T&&tree[cur].num!=E) T=0;//如果根节点的节点数不等于总节点数,那么就不止一棵树,不符合条件,令T=0.
		
		if(T) printf("Case %d is a tree.\n",Case++);
		else printf("Case %d is not a tree.\n",Case++);
			
		
	}
	end2: 
	
return 0;
}




你可能感兴趣的:(poj,并查集)