HDU1272:带权并查集

HDU1272

题解:判断是否构成一棵树,可以用DFS也可以用并查集,这里用并查集做

DFS做法可以参考我的博客hihocoder 1322

注意一开始就输入0 0的情况为空树,也是Yes

代码:

#include <bits/stdc++.h>
using namespace std;
int const N = 100000 + 10;
int fa[N],vis[N];
bool ans;
void Init(){
	for(int i=0;i<N;i++)	fa[i] = i,vis[i] = false;
	ans = true;
}
int find(int x){
	return x == fa[x] ? x : (fa[x] = find(fa[x]));
}
void Union(int x,int y){
	vis[x] = vis[y] = true;
	int px = find(x),	py = find(y);
	if(px != py)
		fa[px] = py;
	else ans = false;
}
int main(){
	int x,y;
	Init();
	while(cin>>x>>y){
		if(!x && !y){
			cout<<"Yes"<<endl;
			continue;
		}
		if(x == -1 && y == -1)	return 0;
		Union(x,y);
		while(cin>>x>>y){
			if(!x && !y)	break;
			Union(x,y);
		}
		bool first = true;
		int top;
		for(int i=1;i<N;i++){
			if(vis[i]){
				if(first){
					top = find(i);
					first = false;
				}else{
					if(find(i) != top)	
						ans = false;
				}
			}
		}
		if(ans)	cout<<"Yes"<<endl;
		else 	cout<<"No"<<endl;
		Init();
	}
}

 

posted @ 2019-02-10 20:35  月光下の魔术师  阅读(6)  评论(0)    收藏  举报