zoukankan      html  css  js  c++  java
  • How Many Tables 并查集(求有几个集合)

    Problem Description
    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
    ***************************************************************************************************************************
    并查集  求集合的个数
    ***************************************************************************************************************************
     1 #include<iostream>
     2 #include<string>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<cmath>
     6 using namespace std;
     7 int fa[10010];
     8 int cas,i,j,k,n,m,a,b;
     9 int find(int x)
    10 {
    11     while(x!=fa[x])
    12       x=fa[x];
    13     return x;
    14 }
    15 void UNon(int x,int y)
    16 {
    17     int a=find(x);
    18     int b=find(y);
    19     if(a!=b)
    20     fa[a]=b;
    21 }
    22 int main()
    23 {
    24     int sum[10001],ans;
    25     while(scanf("%d",&cas)!=EOF)
    26     {
    27         while(cas--)
    28         {
    29             memset(sum,0,sizeof(sum));
    30             scanf("%d %d",&n,&m);
    31             for(i=1;i<=n;i++)
    32              fa[i]=i;
    33             for(i=1;i<=m;i++)
    34             {
    35                 scanf("%d %d",&a,&b);
    36                 UNon(a,b);
    37             }
    38             for(i=1;i<=n;i++)
    39              fa[i]=find(fa[i]);
    40             for(i=1;i<=n;i++)
    41              sum[fa[i]]=1;
    42             ans=0;
    43             for(i=1;i<=n;i++)
    44              ans+=sum[i];
    45             printf("%d
    ",ans);
    46         }
    47     }
    48     return 0;
    49 }
    View Code
  • 相关阅读:
    java 调用可执行文件时,ProcessBuilder异常CreateProcess error=2
    easyUI行内编辑与jdbc批量更新
    Oracle中merge into应用举例
    mybatis插入List<Map<String, String>>批量数据到Oracle数据库
    插入数据库值大于数据库字段设置的长度导致的mapper执行中断,控制台未报错
    ORA-25156:旧样式的外部联接(+)不能与 ANSI链接一起使用
    Oracle列转行函数listagg使用演示
    Oracle查询序列和函数方法封装
    js取url问号后的参数方法封装
    linux查看文件具体时间和大小
  • 原文地址:https://www.cnblogs.com/sdau--codeants/p/3397688.html
Copyright © 2011-2022 走看看