题目链接:(=^ ^=)
思路:判断2点是不是在一个集合(是的话不行, 不是可以), 如果不在一个集合最后还要判断所有的点是不是在一个集合。(以下用一个集合中的点数与出现的点数判断)
(wa了半天结果是数组开小了 纠结)
code:
#include <stdio.h>
#include <string.h>
int rank[100002], father[100002], used[100002], flag = 0, max = 0, count = 0, min = 1000002;
int find(int x)
{
if(father[x] != x)
father[x] = find(father[x]);
return father[x];
}
void Union(int x, int y)
{
int fx = find(x), fy = find(y);
if(fx == fy)//在一个集合中
{
flag = 1;
return ;
}
if(rank[fx] >= rank[fy])
{
father[fy] = fx;
rank[fx] += rank[fy];
}
else
{
father[fx] = fy;
rank[fy] += rank[fx];
}
}
int main()
{
int i = 0, a = 0, b = 0, sum = 0, fx = 0;
while(scanf("%d %d",&a,&b) , (a != -1 && b != -1))
{
if(a == 0 && b == 0)
{
if(sum)
fx = find(min);
if(flag || sum != rank[fx])//实际的点数不等于集合中的点数
printf("No\n");
else
printf("Yes\n");
for(i = min; i<=max; i++)
{
father[i] = 0;
rank[i] = 0;
used[i] = 0;
}
sum = flag = count = max = 0;
min = 1000002;
}
else
{
if(!flag)
{
if(!used[a]){sum++; used[a] = 1; father[a] = a; rank[a] = 1;};//初始化父节点 与集合中的元素
if(!used[b]){sum++; used[b] = 1; father[b] = b; rank[b] = 1;};
Union(a,b);
if(a>max)
max = a;
if(b>max)
max = b;
if(a<min)
min = a;
if(b<min)
min = b;
}
}
}
return 0;
}