zoukankan      html  css  js  c++  java
  • HDU 1856

    并查集基本应用、

    题意:有编号为1到10^7的男生在一个房间,现在给出n组数据,每组数据包括两个编号,且这两个编号的人是朋友,如果A和B是朋友,B和C是朋友,那么A,B,C三人都是朋友,哪一个朋友圈中人数最多,输出这个朋友圈的人数

    思路:因为编号是1到10^7所以,每次都要求出最大的编号数,如果每次都循环到10^7的话是会超时的,最后利用路径压缩,记录和的话是用的寻找根节点然后++

    (提醒一下:如果数据很多的话用scanf输入比较好,cin的话会很慢)

     1 #include<cstdio>
     2 #include<cmath>
     3 const int qq=1e7+1;
     4 int par[qq],sum[qq];
     5 int n;
     6 void handle()
     7 {
     8     for(int i=1;i<=1e7;++i){
     9         par[i]=i;
    10         sum[i]=0;
    11     }
    12 }
    13 int find(int x)
    14 {
    15     while(x!=par[x])
    16         x=par[x];
    17     return x; 
    18 }
    19 void unio(int x,int y)
    20 {
    21     int fx=find(x);
    22     int fy=find(y);
    23     par[fy]=fx;
    24     int t;
    25     while(x!=fx){
    26         t=par[x];
    27         par[x]=fx;
    28         x=t;
    29     }
    30 }
    31 int main()
    32 {
    33     while(scanf("%d",&n)!=EOF)
    34     {
    35         handle();
    36         int x,y;
    37         int Max=0;
    38         for(int i=1;i<=n;++i){
    39             scanf("%d%d",&x,&y);
    40             if(x>Max)    Max=x;
    41             if(y>Max)    Max=y;
    42             if(find(x)!=find(y))
    43                 unio(x,y);
    44         }
    45         int mmax=1;
    46         for(int i=1;i<=Max;++i)
    47             sum[find(i)]++;
    48         for(int i=1;i<=Max;++i)
    49             if(mmax<sum[i])    
    50                 mmax=sum[i];
    51         printf("%d
    ",mmax);
    52     }
    53 }
  • 相关阅读:
    作业11 分类与监督学习,朴素贝叶斯分类算法
    第八次作业
    Python之路【第一篇】:Python基础1
    Python之路【第一篇】:Python基础
    Python 6 数字和布尔值及字符串的基本功能
    Python 7 列表 for 字典,嵌套
    Python 4 循环语句while
    Python 5 运算符
    Python 3 条件语句
    Python 2 声明变量 输入输出 练习
  • 原文地址:https://www.cnblogs.com/sasuke-/p/5164560.html
Copyright © 2011-2022 走看看