hdu 1856 并查集 求最大的子树含有元素的个数
来源:互联网 发布:文明mac版 编辑:程序博客网 时间:2024/04/29 03:29
这道题数据有点大, 我再次 被 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 100005using 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\n",num); } return 0 ;}
0 0
- hdu 1856 并查集 求最大的子树含有元素的个数
- hdu 1232 并查集 求连通分量的个数
- HDU 1856(求并查集里元素的个数)
- 并查集应用1—求分集中的元素个数的最大值
- 求子树中含有苹果的节点个数 时间戳+树状数组 poj 3321
- 并查集 删除节点 求集合的个数<set> hdu 2473
- Uva 10608- 并查集,最大的朋友个数
- poj 2524(并查集-求连通子集的个数)
- 并查集(小米面试题求朋友圈的个数)
- 并查集(求朋友圈的个数)
- hdu 1232 / 1213 并查集(求子集个数)
- HDU 1856 More is better(并查集判断集合元素个数)
- HDU 1856 More is better(越多越好,并查集,节点的个数)
- 并查集(求树的节点的总个数)
- More is better(找并查集最大中元素个数)
- 求含有n个元素的集合的幂集
- ZOJ_3789_Gears(可统计集合元素个数和可删除结点的带权并查集)
- uva 10608 Friends(求并查集集合中元素个数)
- 关于C#中集合和数组(三)
- hdu 数论专题
- hdu 4503 找全是朋友或全不是朋友
- hdu 4501 动态规划 + 费用背包问题
- hdu 1232 / 1213 并查集(求子集个数)
- hdu 1856 并查集 求最大的子树含有元素的个数
- poj 1182 并查集
- hdu 3635 并查集
- hdu 1272 并查集
- hdu 1027 排列生成器
- hdu 1020 简单的字符串处理
- hdu 1039 连续字符串处理
- hdu 1048 字符串
- hdu 1073 字符串函数的应用