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 }
  • 相关阅读:
    软件下载
    01_动态规划之01背包问题
    25_使用切片建立一个动态的二位数组.go
    为什么突然想起来写博客
    24_切片的使用
    23_随机数的生成和冒泡排序
    22_数组做函数参数
    21_一维数组和二位数组的使用
    20_指针类型的使用
    19_获取命令参数
  • 原文地址:https://www.cnblogs.com/sasuke-/p/5164560.html
Copyright © 2011-2022 走看看