认老乡

来源:互联网 发布:商贸公司记账软件 编辑:程序博客网 时间:2024/04/28 07:41

认老乡

大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小赛尤其热衷。但是大家都不告诉小赛他们来自哪里,只是说与谁同乡,从所给的信息中,你能告诉小赛有多少人确定是她的同乡吗?

输入
每个测试实例首先包括2个整数,N(1 <= N <= 1000),M(0 <= M <= N*(N-1)/2),代表现有N个人(用1~N编号)和M组关系;
在接下来的M行里,每行包括2个整数,a,b,代表a跟b是同乡;
当N = 0,M = 0输入结束;
已知1表示小赛本人。

考虑并查集的应用

#include <stdio.h>#define maxn 1001int num[maxn];int father[maxn];int n , m;void init(int n){    for(int i = 1; i <= n; i++)        father[i] = i;} //找到自己的父节点int find(int x){    while(x!=father[x])        x = father[x];    return x;}//合并两个节点void unit(int a, int b){    int father_a = find(a);    int father_b = find(b);    if(father_a!=father_b){        for(int i = 1; i <= n; i++){            if(find(i) == father_a){                father[i] = father_b;            }        }    }}int main(){     while(~scanf("%d %d", &n, &m)){        if(n==0 && m==0) break;        init(n);        int a , b;        while(m--){            scanf("%d %d",&a, &b);            unit(a, b);        }        int ans = 0;        int f = find(1);        //printf("The father o 1 is : %d\n", f);        for(int i = 2; i <= n ; i++){            if(find(i) == f) ans++;        }        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击