小希的迷宫 hdu1272 并查集

http://acm.hdu.edu.cn/showproblem.php?pid=1272

稍稍变异的并查集。

题意:给出几个等价关系,判断通过这些等价关系所有点是否都连通,并且每两个点之间只有一条路可走。若符合这两个条件,输出“Yes”,否则输出"No"。

#include <iostream>
using namespace std;
#define N 100005
int room[N];
bool set[N];

int findfather(int n){
	if (n!=room[n])
		room[n]=findfather(room[n]);
	return room[n];
}

inline void swap(int &a,int &b){
	int t;
	t=a;
	a=b;
	b=t;
}

int main(){
#ifndef ONLINE_JUDGE
	freopen("1272in.txt","r",stdin);
#endif
	int h,t,a,b,i,num;
	bool flag;
	while (true){
		for (i=1;i<N;i++)
			room[i]=i;
		memset(set,false,sizeof(set));
		h=N;
		t=0;
		scanf("%d%d",&a,&b);
		flag=true;
		if (a==-1&&b==-1)
			break;
		while (a&&b){
			if (a>b)
				swap(a,b);
			if (a<h)
				h=a;
			if (b>t)
				t=b;
			set[a]=true;
			set[b]=true;
			a=findfather(a);
			b=findfather(b);
			if (a==b)  //这里判断是否每个点之间只有一条路可走
				flag=false;
			else {
				if (a<=b)
					room[b]=a;
				else room[a]=b;
			}
			scanf("%d%d",&a,&b);
		}
		num=0;
		for (i=h;i<=t;i++)  //这里判断是否所有点都连通
			if (room[i]==i&&set[i])
				num++;
		if (num>1)
			flag=false;
		if (flag)
			printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值