码迷,mamicode.com
首页 > 其他好文 > 详细

小希的迷宫

时间:2020-05-07 00:27:33      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:小希的迷宫   ios   eset   cout   cpp   asi   return   The   print   

http://acm.hdu.edu.cn/showproblem.php?pid=1272  题目链接

 

 

思路:

1.每输入一组数据,如果两个点的祖先都是相同的,那么说明他们已经是一个集合的了,如果再连接a,b两个点,就会构成回路,这里也就是要输出no.

2.并查集判断是否存在回路已经通过上述过程判断完成了,但是我们要保证只有一个集合,题目中没有保证,所以我们这里首先要对出现过的点进行标记,然后从1到100005这些个点都进行判断,如果标记过(表示这个点出现过)并且f[i]==i的话,那么就说明i现在是个祖宗,表示有一个集合了,这里如果集合大于1,那就说明要输出NO了。

#include<iostream>
#include<map>
#include<string.h>
using namespace std;
// typedef struct node
// {
// 	int nVal;
// }FindSet;
int judge=0;
int Visit[100005];
map<int,int>SetToFather;
map<int,int>SetSize;

void makeSet()
{
	SetToFather.clear();
	SetSize.clear();
	//coding
	for(int i=0;i<100005;i++)
	{
		SetSize[i]=1;
		SetToFather[i]=i;
	}

}

int FindHead(int nVal)
{
	int father=SetToFather[nVal];
	if(nVal!=father)
	{
		father=FindHead(father);
	}
	SetToFather[nVal]=father;
	return father;
}

int UnionSet(int naVal,int nbVal)
{
	int afather=FindHead(naVal);
	int bfather=FindHead(nbVal);
	Visit[naVal]=1;
	Visit[nbVal]=1;
	if(afather==bfather)
	{
		judge=1;

	}
	else
	{
		int asize=SetSize[afather];
		int bsize=SetSize[bfather];
		if(asize>bsize)
		{
			SetToFather[bfather]=afather;
			SetSize[afather]=asize+bsize;
		}
		else
		{
			SetToFather[afather]=bfather;
			SetSize[bfather]=asize+bsize;
		}
	}
}


int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int v1,v2;
	while(cin>>v1>>v2)
	{
		if(v1==-1 && v2==-1) break;
		judge=0;
		SetToFather.clear();
		SetSize.clear();
		makeSet();
		memset(Visit,0,sizeof(Visit));	
		if(v1==0 && v2 ==0)
		{
			printf("Yes\n");
			continue;
		}
		UnionSet(v1,v2);
		while(cin>>v1>>v2)
		{
			if(v1==0 && v2==0) break;
			UnionSet(v1,v2);
		}
		if(judge)
		{
			printf("No\n");
		}
		else
		{
			int ncount=0;
			for (int i = 0; i < 100005; ++i)
			{
				if(Visit[i]&&FindHead(i)==i)
				{
					//printf("%d\n", i);
					ncount++;
				}
			}
			//printf("%d\n", ncount);
			if(ncount==1)
			{
				printf("Yes\n");
			}
			else
			{
				printf("No\n");
			}
		}

	}
	return 0;
}

  

小希的迷宫

标签:小希的迷宫   ios   eset   cout   cpp   asi   return   The   print   

原文地址:https://www.cnblogs.com/RainzzZ/p/12839934.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!