【M - 小希的迷宫】

思路:

  • 很容易想到是并查集,若新路的两端已经联通,则成环(不符合要求)。
  • 但是有坑:首先小希要求 “任意两个房间都有且仅有一条路”,即全图是强连通的。若树根有两个或两个以上则不符合要求。
  • 若直接输入 “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;
}

猜你喜欢

转载自blog.csdn.net/flash403/article/details/94724218
今日推荐