http://acm.hdu.edu.cn/showproblem.php?pid=1272
#include<iostream>// 好奇怪,為何我開始寫的不行??
#include<cstdio> // 1 要求無迴路 2 只有一棵樹
#include<algorithm>
using namespace std;
const int MAX=100001;
int set[MAX];
bool mark[MAX];
int find(int x)
{
int r = x;
while(set[r] != r) r = set[r];
return r;
}
void mergy(int p, int q)
{
set[max(p, q)] = min(p,q);
// mark[min(p,q)] = true;
// if(p > q)
// set[p] = q;
// else
// set[q] = p;
}
int main()
{
int a, b, max1, min1, flag,i;
while(scanf("%d%d",&a, &b)!=EOF)
{
if(a == -1 && b == -1)
{
//flag = 1;
break;
}
if(a == 0 && b == 0)
{
//flag = 2;
printf("Yes/n");
continue;
}
for( i = 0; i < MAX; i++)
{
set[i] = i;
mark[i] = false;
}
flag = 0;
max1 = -222;
min1 = 1000000;
//max1 = max(max1, max(a, b));//為何這樣的語句就是不行啊??
// min1 = min(min1, max(a, b));
if(a > max1) max1 = a;
if(b > max1) max1 = b;
if(a < min1) min1 = a;
if(b < min1) min1 = b;
// int t = max (a , b);
// max1 = max(max1, t);
// int tt =min(a, b);
// min1 = max(max1 ,tt);
mark[a] = true;
mark[b] = true;
a = find(a);
b = find(b);
mergy(a,b);
while(scanf("%d%d",&a, &b)!=EOF)
{
if(a == 0 && b == 0)
break;
// max1 = max(max1, max(a, b));
// min1 = min(min1, max(a, b));
if(a > max1) max1 = a;
if(b > max1) max1 = b;
if(a < min1) min1 = a;
if(b < min1) min1 = b;
//int t = max (a , b);
// max1 = max(max1, t);
//int tt =min(a, b);
// min1 = max(max1 ,tt);
mark[a] = true;
mark[b] = true;
a = find(a);
b = find(b);
if(a == b)
{
flag = -1;
}
else
{
mergy(a,b);
}
}
if(flag == -1)
{
printf("No/n");
}
else
{
for(i = min1; i<= max1; i++)
if(set[i] == i && mark[i])
flag++;
if(flag == 1)
printf("Yes/n");
else
printf("No/n");
}
}
}