随笔 - 81  文章 - 0  评论 - 0  阅读 - 7175 

问题:How Many Tables

Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not want to stay with strangers.

One important rule for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table.

For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least.

Input:The input starts with an integer T(1<=T<=25) which indicate the number of test cases. Then T test cases follow. Each test case starts with two integers N and M(1<=N,M<=1000). N indicates the number of friends, the friends are marked from 1 to N. Then M lines follow. Each line consists of two integers A and B(A!=B), that means friend A and friend B know each other. There will be a blank line between two cases.

Output:For each test case, just output how many tables Ignatius needs at least. Do NOT print any blanks.

Sample Input

2
5 3
1 2
2 3
4 5

5 1
2 5

Sample Output

2
4
复制代码
#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;
const int maxn = 1050;
int a[maxn];

int Find(int n);
void merge(int x,int y);

int main(){
    int t;
    cin>>t;
    while(t--){
        int n,m;
        cin>>n>>m;
        for(int i=1;i<maxn;i++){
            a[i] = i;
        }
        int x,y;
        for(int i=1;i<=m;i++){
            cin>>x>>y;
            merge(x,y);
        }
        int ans = 0;
        for(int i=1;i<=n;i++){
            if(a[i]==i){
                ans++;
            }
        }
        cout<<ans<<endl;
    }    
    return 0;
}

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

void merge(int x,int y){
    int fx = Find(x);
    int fy = Find(y);
    if(fx!=fy){
        a[fx] = fy;
    }
}
复制代码

 

posted on   晨曦生辉耀匕尖  阅读(140)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
点击右上角即可分享
微信分享提示