POJ 1308 Is It A Tree?

并查集

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

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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值