//中文题。。题意不需解释。。。并查集题目,判断条件显然为所有输入的点都已经访问到并且总集合数为1,
//同时如果对当前输入的两个点,他们的root必须不一样,因为如果一样即可以从这两个点的任意一个点出发访问到另一个点。。。
//如上述条件都满足则可以输出Yes,反之输出No。本人此题RE了N次,
//表示如果OJ显示STACK FLOW就是main()函数里面的数组开多开大了,少用数组即可。。。。
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cstdlib>
using namespace std;
///尽量节约数组,省点空间
int Find(int x)
{
if(x==fa[x]) return x;
else return Find(fa[x]);
}
void Union(int x,int y)
{
int tempx=Find(x);
int tempy=Find(y);
if(tempx==tempy) return ;
else
fa[tempx]=tempy;
}
void init()
{
for(int i=1;i<=m;i++)
fa[i]=i;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
for(int i=1;i<=n;i++)
{
scanf("%d%d",&tempa,&tempb);
if(Find(tempa)==Find(tempb))
{
flag=false; break;
}
else
Union(tempa,tempb);
}
int test=Find(1);
for(int i=1;i<=m;i++)
if(Find(i)!=test)
flag=false,break;
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
HDU 1272 并查集
最新推荐文章于 2021-09-09 16:08:54 发布