360笔试编程题 找老乡(并查集解法)

题目:大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡。来自新疆的小鲵尤其热衷。但是大家都不告诉小尼他们来自哪里,只是说与谁同乡。从所给的信息中,你能告诉小尼有多少人确定是她的同乡么?
输入:每个测试实例首先包括两个整数,N(1 = < N < = 1000),M(0 = < M < = N*(N-1)/2),代表现在有N个人(用1~N编号)和M组关系;
在接下来的M行里,每行包括两个整数,a,b,代表a跟b是同乡;
当N=0,M=0输入结束;
已知1表示小尼本人。
输出: 对于每个测试实例,输出一个整数,代表确定是小尼同乡的人数。
方法:两种方法,图的遍历和并查集,本文为并查集解法。
代码:

#include <iostream>
#include <stdlib.h>
using namespace std;

class CheckSet
{
private:
    int data[1000];
    int size;
public:
    CheckSet()
    {
        size = 1000;
        for (int i = 0; i < 1000; ++i)
            data[i] = i;
    }
    CheckSet(int n)
    {
        for (int i = 0; i <=n; ++i)
            data[i] = i;
        size = n;
    }
    int find(int x)
    {
        return data[x];
    }
    void join(int x, int y)
    {
        int fx = find(x), fy = find(y);
        if (fx != fy)
        {
            for (int i = 0; i <= size; ++i)
                if (data[i] == fx) data[i] = fy;
        }
    }
};

int main(int argc, char *argv[])
{
    int num, relation, a, b;
    cin >> num >> relation;
    CheckSet friendship(num+1);
    for (int i = 0; i < relation; ++i)
    {
        cin >> a >> b;
        friendship.join(a, b);
    }

    int ans = 0;
    int pos= friendship.find(1);
    for (int i = 0; i <= num; ++i)
    {
        if (friendship.find(i) == pos) ans++;
    }
    cout << ans-1<<endl;
}

测试结果:这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值