
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Yes Yes No
#include<set>
#include<map>
#include<iostream>
#include<string.h>
using namespace std;
const int M=500004;
int F[M];
int cnt[M];
int Find(int x)
{
int r=x;
while(F[r]!=r)
r=F[r];
int k=x;
while(k!=r)
{
int t=F[k];
F[k]=r;
k=t;
}
return r;
}
bool Is_same(int x,int y)
{
return Find(x)==Find(y);
}
void union_set(int x , int y)
{
int tx=Find(x);
int ty=Find(y);
if(tx!=ty)
{
F[tx]=ty;
}
}
int main()
{
int flag1=0;
int a,b;
loop:
for(int j=0; j<M; j++)
F[j]=j;
int aa=0,count=0;
set<int>dict;
int flag2=0;
memset(cnt,0,sizeof(cnt));
int MM=-1,MII=9999999;
cin>>a>>b;
if((a==-1)&&(b==-1))
return 0;
else if(a==0&&b==0)
{
cout<<"Yes"<<endl;
goto loop;
}
else
{
if(!cnt[a])
aa++;
if(!cnt[b])
aa++;
count++;
cnt[a]=1;
cnt[b]=1;
if(a>MM)
MM=a;
if(b>MM)
MM=b;
if(a<MII)
MII=a;
if(b<MII)
MII=b;
union_set(a,b);
}
while(cin>>a>>b,a+b)
{
if(!cnt[a])
aa++;
if(!cnt[b])
aa++;
count++;
cnt[a]=1;
cnt[b]=1;
if(a>MM)
MM=a;
if(b>MM)
MM=b;
if(a<MII)
MII=a;
if(b<MII)
MII=b;
union_set(a,b);
}
for(int t=MII; t<=MM; t++)
{
if(cnt[t]==1)
dict.insert(Find(t));
}
if(dict.size()!=1)
flag2=1;
if(!flag2&&aa==count+1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
dict.clear();
goto loop;
return 0;
}
#include<set>
#include<iostream>
#include<string.h>
using namespace std;
const int M=100004;
int F[M];
int Find(int x)
{
int r=x;
while(F[r]!=r)
r=F[r];
int k=x;
while(k!=r)
{
int t=F[k];
F[k]=r;
k=t;
}
return r;
}
bool Is_same(int x,int y)
{
return Find(x)==Find(y);
}
void union_set(int x , int y)
{
int tx=Find(x);
int ty=Find(y);
if(tx!=ty)
{
F[tx]=ty;
}
}
int main()
{
set<int>dict;
int flag1=0;
for(int j=0; j<M; j++)
F[j]=j;
int a,b,flag=0;
loop:
while(cin>>a>>b,a+b)
{
flag=1;
if((a==-1)&&(b==-1))
return 0;
dict.insert(a);
dict.insert(b);
if(Is_same(a,b))
flag1=1;
union_set(a,b);
}
if(!flag)
{
cout<<"Yes"<<endl;
goto loop;
}
int flag2=0;
set<int> ::iterator it=dict.begin();
int f0=Find(*it);
it++;
for(; it!=dict.end(); it++)
{
if(Find(*it)!=f0)
flag2=1;
}
//cout<<"flag="<<flag1<<" flag2="<<flag2<<endl;
if(flag1||flag2)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
dict.clear();
for(int j=0; j<=M; j++)
F[j]=j;
flag=0;
goto loop;
return 0;
}
原文:http://blog.csdn.net/lsgqjh/article/details/45973721