写了两道题
#include <stdio.h>
#include <stdlib.h>
struct hly
{int left;int right;int d;
}q[100005];
int main()
{int n,m,k,p;scanf("%d",&n);q[1].left=0;q[1].right=0;q[0].left=1;q[0].right=1;for(int i=2;i<=n;i++){scanf("%d %d",&k,&p);if(p==1){q[i].right=q[k].right;q[i].left=k;q[k].right=i;q[q[i].right].left=i;}if(p==0){q[i].left=q[k].left;q[i].right=k;q[k].left=i;q[q[i].left].right=i;}}scanf("%d",&m);while(m--){int x;scanf("%d",&x);q[x].d=1;}int t=q[0].right;while(t!=0){if(q[t].d==0)printf("%d ",t);t=q[t].right;}return 0;
}
#include <stdio.h>
#include <stdlib.h>
int p[1005];
int find(int x)
{if(p[x]==x)return x;return p[x]=find(p[x]);
}
void join(int x,int y)
{int fx=find(x);int fy=find(y);if(fx!=fy)p[fx]=p[fy];
}
int main()
{int n,m,num=0;while(1){scanf("%d",&n);if(n==0)return 0;scanf("%d",&m);for(int i=1;i<=n;i++){p[i]=i;}for(int i=1;i<=m;i++){int a,b;scanf("%d %d",&a,&b);join(a,b);}for(int i=1;i<=n;i++){if(find(i)==i)num++;}printf("%d\n",num-1);num=0;}return 0;
}