HDU1213 How Many Tables【并查集】

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1213

题目大意:

N个朋友聚会,只有认识的人才会坐在一桌。给你M个朋友关系(A,B),表示A认识B。且认识

关系具有传递性。即如果A认识B,B认识C,那么A也认识C。所以A、B、C可以坐在一桌上。

那么问题来了:问:如果让认识的人坐一桌,那么最少要安排多少张桌子才能满足要求。

思路 :

直接能想到用并查集来做。对于所给认识关系(A、B),查找二人的父节点是否相同,不相同则并

为一个集合,相同说明之前已经认识了(不做出来)。最后统计集合的个数就行了。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 1100;

int father[MAXN],ANS[MAXN];

int Find(int x)
{
    if(x != father[x])
        father[x] = Find(father[x]);
    return father[x];
}

int main()
{
    int T,a,b,M,N;
    cin >> T;
    while(T--)
    {
        memset(ANS,0,sizeof(ANS));
        cin >> N >> M;
        for(int i = 0; i <= N; ++i)
            father[i] = i;
        for(int i = 0; i < M; ++i)
        {
            cin >> a >> b;
            a = Find(a);
            b = Find(b);
            if(a != b)
                father[b] = a;
        }
        int ans = 0;
        for(int i = 1; i <= N; ++i)
        {
            a = Find(i);
            ANS[a]++;
        }
        for(int i = 1; i <= N; ++i)
            if(ANS[i] != 0)
                ans++;
        cout << ans << endl;
    }

    return 0;
}
时间: 2024-10-14 05:36:54

HDU1213 How Many Tables【并查集】的相关文章

hdu1213 How Many Tables(并查集)

How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17946    Accepted Submission(s): 8822 Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinn

HDU1213最简单的并查集问题

题目地址 http://acm.hdu.edu.cn/showproblem.php?pid=1213 1 #include<iostream> 2 using namespace std; 3 #define MAX 100005 4 int fa[MAX]; 5 6 int findHead(int x) 7 { 8 while(x!=fa[x]) 9 x=fa[x]; 10 return x; 11 } 12 13 void Union(int x,int y) 14 { 15 int

HDU 1213 How Many Tables (并查集)

How Many Tables Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1213 Appoint description:  System Crawler  (2015-05-25) Description Today is Ignatius' birthday. He invites a lot of friends. Now

HDU 1213 How Many Tables (并查集,常规)

并查集基本知识看:http://blog.csdn.net/dellaserss/article/details/7724401 题意:假设一张桌子可坐无限多人,小明准备邀请一些朋友来,所有有关系的朋友都可以坐同一张桌,没有关系的则要另开一桌,问需要多少张桌子(小明不坐,不考虑小明与其他人的关系)? 思路:常规的并查集.要求出所有人的老大,有几个老大就要几张桌子.那么有关系的都归为同一个老大.用数组实现,再顺便压缩路径. 1 #include <bits/stdc++.h> 2 #define

HDU 1213 How Many Tables (并查集,连通分支数,两种方式)

How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23012    Accepted Submission(s): 11485 Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's din

How Many Tables——并查集模板题

题目链接 题意: n个人参加晚宴;完全不认识的两个人不能被分配在同一餐桌;认识具有传递性:A认识B B认识C,那么A和C也认识. 题解: 将认识两个人合并到同一集合:最后统计有多少个不同的集合即可; 代码: #include<iostream> #include<stdio.h> #include<math.h> using namespace std; typedef long long ll; const int maxn=5e5+5; int f[maxn]; i

HDU1232 畅通工程 并查集

这道题跟HDU 1213 How Many Tables 并查集非常接近,都是赤裸裸的并查集的题. 思路:假设还需要建n-1条路,每并一次就自减1. 参考代码: #include<stdio.h> int fa[1000]; int find(int u) { return fa[u]==u?u:fa[u]=find(fa[u]); } int main() { int i,n,m,u,v,x,y; scanf("%d%d",&n,&m); while (n

HDU1213 How Many Tables 【并查集】

How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13360    Accepted Submission(s): 6539 Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinn

HDU1213 How Many Tables 【标准并查集】

How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15359    Accepted Submission(s): 7525 Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinn

HDU1213:How Many Tables(并查集)

How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 46694    Accepted Submission(s): 23319 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Description: Today is Ignatius' birthda