[usaco2010 Nov] Daisy Chains in the Field 一道特别蒟蒻的并查集水题

FJ 让他的N (1 <= N <= 250)只编号为从1到N的奶牛在田地里玩.这些奶牛决定用M条(1<=M<=N*(N+1)/2)牛绳将各自连接起来.
当然,不会出现一对牛被两条及以上牛绳连接起来.输入告诉你每一条牛绳连接的两只奶牛C1和C2(1 <= c1 <= N; 1 <= c2 <= N; c1 <> c2).
FJ要求奶牛们与1号奶牛相连.现在你要帮助FJ找出所有没有与1号奶牛相连的奶牛.这里的相连既可以是直接的,也可以是间接的
(特别的,1号奶牛总是与自己相连).将没有与1号奶牛相连的奶牛的编号升序输出.如果你找不到这样的一只牛,那么就输出0.
解释一下的话,看这个有6只奶牛和4个连接的例子:
1—2 4—5
\ |
\ | 6
|
3

很明显,4,5,6号牛没有同1号牛相连.
Input
第1行:两个用空格分开的整数N,M
第2…M+1行:每一行有两个整数.第i+1行描述的是绳子i连接的两只奶牛的编号,即C1和C2.
Output
很多行:每一行包含一个整数,意义如题目所说.升序输出.
Sample Input
6 4
1 3
2 3
1 2
4 5
Sample Output
4
5
6
HINT
Source
并查集入门
————————————————————————————————————
这道题呢,其实就是一道并查集大水题,查每个点与1是否并在一个集合中,如果不在就输出。(但是本人因为忽略了没有牛连着1的话要输出0,因此WA了几遍。
*CODE

#include
using namespace std;
int n,m,father[251];
bool pd;
int find(int x)//查找
{
    if(father[x]!=x)
       return father[x]=find(father[x]);
    else
       return x;
}
int main()
{
    pd=false;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        father[i]=i;
    }
    for(int i=1;i<=m;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        int t1=find(a),t2=find(b);
        if(t1!=t2)//如果不在同一集合内
        {
            father[t2]=t1;//把它们并到一个集合内
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(find(i)!=find(1))
        {
           printf("%d\n",i);//输出不与1在一个集合内的牛
           pd=true;
        }
    }
    if(pd==false)
       printf("0");
    return 0;
}

谢谢神犇的观看,望神犇不要嫌弃。

你可能感兴趣的:(并查集)