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 }
  • 相关阅读:
    POJ 3687 Labeling Balls()
    POJ 2777 Count Color(线段树之成段更新)
    POJ 1961 Period( KMP )*
    POJ 2406 Power Strings (KMP)
    hdu 2199 Can you solve this equation?(二分搜索)
    10679 多少个1
    POJ 2823 Sliding Window
    POJ 2299 Ultra-QuickSort(线段树入门)
    最短路径—Dijkstra算法和Floyd算法
    poj1125&zoj1082Stockbroker Grapevine(Floyd算法)
  • 原文地址:https://www.cnblogs.com/sasuke-/p/5164560.html
Copyright © 2011-2022 走看看