• HDU1213 How many tables


    HDU1213 How many tables

    问题描述

    今天是依纳爵(Ignatius)的生日。他邀请了很多朋友。现在是晚饭时间。伊格内修斯想知道他至少需要多少张桌子。您必须注意,并不是所有的朋友都彼此认识,并且所有的朋友都不想和陌生人呆在一起。
    解决此问题的一条重要规则是,如果我告诉您A认识B,而B认识C,则意味着A,B,C彼此认识,因此它们可以呆在一张桌子上。
    例如:如果我告诉你A知道B,B知道C,D知道E,那么A,B,C可以留在一个表中,而D,E必须留在另一个表中。因此,伊格纳修斯至少需要2张桌子。

    输入项:

    输入以整数T(1 <= T <= 25)开头,该整数表示测试用例的数量。然后是T测试用例。每个测试用例均以两个整数N和M(1 <= N,M <= 1000)开头。N表示朋友的数量,朋友从1到N标记。然后跟随M行。每行包含两个整数A和B(A!= B),这意味着朋友A和朋友B彼此认识。两种情况之间将有一个空白行。

    输出量:

    对于每个测试用例,只需输出Ignatius至少需要多少个表。请勿打印任何空白。

    样本输入

    2
    5 3
    1 2
    2 3
    4 5
    
    5 1
    2 5

    样本输出

    2
    4

     

    #include<iostream>
    #include<bits/stdc++.h>
    const int max_size=1000;
    using namespace std;
    int pre[max_size];
    void init_set(int count){
        for (int i = 1; i <= count; i++)
        {
            pre[i]=i;
        }
    }
    int find_set(int x){
        return x==pre[x]?x:find_set(pre[x]);
    }
    void union_set(int x,int y){
        x =find_set(x);
        y=find_set(y);
        if(x!=y) pre[x]=pre[y];
    }
    
    
    
    
    int main(){
        int n;
        cin>>n;
        int a,b,c,d;
        while (n--)
        {
            cin>>a>>b;
            init_set(a);
            for (int i = 1; i <= b; i++)
            {
                cin>>c>>d;
                union_set(c,d);
            }
            int ans=0;
            for (int i = 1; i <= a; i++)
            {
                if (pre[i]==i)
                    ans++;
            }
            cout<<ans<<endl;
        }
    }

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13673510.html

  • 相关阅读:
    【计算机网络】复习集(更新中)
    滑雪 (记忆化搜索)
    橱窗布置
    复制书稿 (dp+贪心)
    8786:方格取数 (多线程dp)
    编辑距离
    8782:乘积最大
    合并石子 (区间dp+前缀和)
    6045:开餐馆
    6049:买书 (完全背包)
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13673510.html
Copyright © 2020-2023  润新知