HDU 1213 How Many Tables(并查集)

本文探讨如何使用并查集算法解决派对中朋友间社交关系复杂时,合理安排桌次的问题。通过输入数据组数、朋友数量及相互认识的关系对,输出所需桌子数量,实现高效桌次分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

[kuangbin带你飞]专题五 并查集 C - How Many Tables

题目描述:

有一天,一个哥们要过生日,寻思招待一顿,摇了很多朋友,但是朋友之间如果完全不认识(可以间接认识:AB认识,BC认识——>AC认识),坐在一起会尴尬,所以不会坐在一起,所以他不知道要用多少张桌子,想算一下(yy:他家卖桌子的,所以不会缺桌子,他家的桌子很大,可以坐很多很多人)

输入描述:

第一行表示输入数据组数
对于每组数据:
第一行两个数字n, m表示摇了n个哥们,m表示一共输入互相认识的对数
之后m行每行两个数,表示A与B互相认识。

输出描述:

每组数据输出一个整数,表示需要的桌子数

思路:

并查集,两个人相互认识,就合并,最后求桌子数,相当于求父亲是自己的结点个数,因为如过父亲节点是自己的话表示他铁定能占一张桌子,不管谁跟他一张桌子,或有没有人跟他一桌,他这张桌子占定了。很浅显的道理鄙人就不再赘述了。

烂代码如下:

/*************************************************************************
    > File Name: hdu_1213.cpp
    > Author: dulun
    > Mail: dulun@xiyoulinux.org
    > Created Time: 2016年03月28日 星期一 21时08分43秒
 ************************************************************************/

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
using namespace std;
const int N = 50086;
int p[N]; 
int find(int x) { return p[x] == x? x: p[x] = find(p[x]); }
void init() { for(int i = 1; i < N; i++) p[i] = i; }

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n, m;
        int ans = 0;
        scanf("%d%d", &n, &m);
        init();
        for(int i = 0; i < m; i++)
        {
            int a, b;
            scanf("%d%d", &a, &b);
            a = find(a);
            b = find(b);
            if(a != b) p[a] = b;
        }
        for(int i = 1; i <= n; i++)
        {//找父亲为自己的结点的个数
            if(p[i] == i) ans++;
        }
        printf("%d\n", ans);
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值