这个题目....出的真好,忍不住为他鼓掌...读题应该没问题...一眼就可以看出来如果并差集合并的时候有两个点已经在一个集合中就直接是NO了...But竟然还需要判断连通性...好判断,只需要把所有出现的数字都标记一下,然后看一下根结点有几个就好了...但是....只有一个0 0也算是YES....这个...大概算是可以?
程序交上去 在VJ第一次G++ 920....去交杭电TLE...懒得优化 回去VJ重新提交TLE...鼓掌...回去HDU 交了C++ 109MS 确定这个真的大丈夫?
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int f[200000],m[200000];
void inti()
{
for(int i=0;i<=100000;i++)
f[i]=i;
}
int find(int x)
{
if(x!=f[x])
return find(f[x]);
return x;
}
int main()
{
int x,y;
while(cin>>x>>y,x!=-1||y!=-1)
{
inti();
memset(m,0,sizeof(m));
int flag=1;
if(x==0&&y==0)
{
cout<<"Yes"<<endl;
continue;
}
int p=99999999,q=-1;
while(x!=0||y!=0)
{
if(x<p) p=x;
if(x>q) q=x;
if(y<p) p=y;
if(y>q) q=y;
m[x]=1,m[y]=1;
int dx=find(x);
int dy=find(y);
if(dx==dy)
flag=0;
else
f[dx]=dy;
cin>>x>>y;
}
if(flag==0)
{
cout<<"No"<<endl;
continue;
}
int ans=0;
for(int i=p;i<=q;i++)
{
if(f[i]==i&&m[i]==1)
ans++;
}
if(ans==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}