标签:小希的迷宫 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