• hdu 1856 并查集 求最大的子树含有元素的个数


    这道题数据有点大, 我再次 被 cin>> he  cin<<out 多次超时, 改成 scanf 和 printf  后一次ac . 欲哭无泪啊!

    完全是 并查集 ,模板 ,只是初始化 有点异样, 最后统计 子树元素的个数 。

    #include<iostream>
    #include<stdio.h>
    #include<string>
    #include<string.h>
    #include<map>
    #include<math.h>
    #define N 10000005
    #define M 100005
    using namespace std;
    
    int rank[N];
    int parent[N];
    int sumnum[N];
    int Find(int x)
    {
        if(x== parent[x]) return x;
        return parent[x]=Find(parent[x]);
    }
    void Union(int x, int y)
    {
         int xf=Find(x);
         int yf=Find(y);
         if(rank[xf] > rank[yf])
            parent[yf]=xf;
        else
        {
            parent[xf]=yf;
            if(rank[xf] == rank[yf])
                rank[yf]++;
        }
    }
    int main()
    {
        int m;
        while(scanf("%d",&m)!=EOF)
        {
            int u[M],v[M],num=1;
            int maxnum=0;
            memset(sumnum,0,sizeof(sumnum));
            for(int i=0;i<m;i++)
            {
                scanf("%d%d",&u[i],&v[i]);
                if(u[i] > maxnum) maxnum = u[i];
                if(v[i] > maxnum) maxnum = v[i];
            }
            for( int i=1;i<=maxnum;i++)     // 初始化
            {
                parent[i]=i;
                rank[i]=0;
    
            }
            for(int i=0;i<m;i++)
            {
                if(Find(u[i]) != Find(v[i]))
                    Union(u[i],v[i]);
            }
    
            for(int i=1;i<=maxnum;i++)    // 统计子树元素个数
            {
                int k=Find(i);
                sumnum[k]++;
                if(sumnum[k]>num)
                    num=sumnum[k];
            }
            printf("%d
    ",num);
        }
        return 0 ;
    }
  • 相关阅读:
    ORM补充文件
    auth.User.groups: (fields.E304) Reverse accessor for 'User.groups'
    JS BOM和DOM
    ctrl+shift+上箭头 改变代码位置
    盒子半透明
    多背景颜色写图片后面
    心跳
    动画
    仿站小工具哈哈哈
    旋转案例
  • 原文地址:https://www.cnblogs.com/zn505119020/p/3578663.html
Copyright © 2020-2023  润新知