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

  • 相关阅读:
    2、netlink简介
    1、netlink 连接器 通信机制
    第一章 02 谈谈static关键词
    第一章 01 namespace 命名空间
    第一章 00 StringUtil.cpp和StringUtil.hh分析
    说说log4cplus
    Jq 操作json
    怪怪的bug,提示值不能为空,连action都不进
    浏览器兼容性部分---FF&IE678
    Jquery 随笔
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13673510.html
Copyright © 2011-2022 走看看