zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    前端 一——介绍
    python知识点拾遗
    python 五——自定义线程池
    python 四——线程、进程、协程
    python 三——列表、字典、元祖、字符串、set
    动态规划法求解0-1背包
    贪心法求解背包问题
    学生成绩管理系统
    [C语言练习]学生学籍管理系统
    [C语言练习]万年历加强版
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13673510.html
Copyright © 2011-2022 走看看