hdoj最sb的题!!!!
学并查集可以做其他的题嘛 ,干嘛写这道?题意都不清楚,还有不讲道理的数据。。。。。
#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int maxn = 200004;
const int maxm = 200004;
int par[maxn];
int vis[maxn];
int find(int u)
{
if(u==par[u]) return u;
else return par[u] = find(par[u]);
}
int main()
{
int u,v,from,to;
while(scanf("%d%d",&from,&to))
{
if(from==-1&&to==-1) break;
if(from==to&&from==0)
{
printf("Yes\n");
continue;
}
memset(vis,0,sizeof(vis));
int id = 1;
for(int i=0;i<maxn;i++) par[i] = i;
int flag = 1;
vis[from] = 1; vis[to] =1;
if(from!=to){
int fa = find(from); int fb = find(to);
par[fa] = fb;
}
while(scanf("%d%d",&u,&v))
{
if(u==0&&v==0) break;
vis[u] = 1; vis[v] = 1;
int fa = find(u);
int fb = find(v);
if(fa==fb) flag = 0;
else if(flag)par[fa] = fb;
id = max(id,u);
id = max(id,v);
}
if(!flag){printf("No\n");continue;}
int k = 0;
for(int i=1;i<=id;i++) if(vis[i]) k++,find(i);
if(k<=1) {printf("No\n");continue; }
set<int>s;
for(int i=1;i<=id;i++)
if(vis[i])
s.insert(par[i]);
if((int)s.size()==1) printf("Yes\n");
else printf("No\n");
}
return 0;
}