【M - 小希的迷宫】

80 篇文章 0 订阅
80 篇文章 0 订阅

思路:

  • 很容易想到是并查集,若新路的两端已经联通,则成环(不符合要求)。
  • 但是有坑:首先小希要求 “任意两个房间都有且仅有一条路”,即全图是强连通的。若树根有两个或两个以上则不符合要求。
  • 若直接输入 “0 0”,说明迷宫没有房间,符合要求。
  • 注意编号不一定顺序,因此要加入 app[maxn]

代码:

  • 46ms 1904kB
//46ms		1904kB 


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 1e5 + 5;

bool ans;
bool app[maxn];
int par[maxn];

void INIT(){
	ans = true;
	memset(par , -1 , sizeof(par));
	memset(app , 0 , sizeof(app));
	return ;
}

int FIND(int i){
	return par[i] == -1 ? i : par[i] = FIND(par[i]) ;
}

void UNION(int l,int r,int parl,int parr){
	par[parr] = parl;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int l,r;
	while(cin>>l>>r && l != -1){
		INIT();
		while(true){
			if(!l)
				break;
			app[l] = app[r] = true;
			int parl = FIND(l);
			int parr = FIND(r);
			if(parl == parr)
				ans = false;
			else
				UNION(l , r , parl , parr);
			cin>>l>>r;
		}
		if(ans){
			int cnt = 0;
			for(int i=0;i<maxn;i++)
				if(app[i] && FIND(i) == i)
					++cnt;
			if(cnt > 1)//0或1都可以 
				ans = false;//不连通则不符合(树根有且仅有一个) 
		}
		if(ans)
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl; 
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值