hdu 1856 求集合里元素的个数 输出最大的个数是多少

求集合里元素的个数 输出最大的个数是多少

Sample Input
4
1 2
3 4
5 6
1 6
4
1 2
3 4
5 6
7 8

Sample Output
4
2

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <cmath>
 6 # include <queue>
 7 # define LL long long
 8 using namespace std ;
 9
10 const int MAXN = 10000010;
11 int F[MAXN];
12 int num[MAXN] ;
13
14 int find(int x)//找x的祖先结点
15 {
16     if(F[x]==x) return x;
17     return F[x]=find(F[x]);
18 }
19 void bing(int u,int v) //按秩合并
20 {
21     int x = find(u);
22     int y = find(v);
23     if(x == y)
24         return ;
25     if(num[x] >= num[y])
26     {
27         F[y] = x;
28         num[x] += num[y];
29     }
30     else
31     {
32         F[x] = y;
33         num[y] += num[x];
34     }
35 }
36 int main()
37 {
38     //freopen("in.txt","r",stdin) ;
39     int n ;
40     while(scanf("%d",&n) != EOF)
41     {
42          if (n == 0)
43          {
44              printf("1\n") ;
45              continue ;
46          }
47          int i ;
48          for(i = 1 ; i <= MAXN ; i++)
49          {
50              F[i] = i ;
51              num[i] = 1 ;
52          }
53         int u , v , t = 0 ;
54         for(i = 1 ; i <= n ; i++)
55         {
56             scanf("%d %d" , &u , &v) ;
57             bing(u,v) ;
58             t = max(t , max(u , v)) ;
59         }
60         int Max = 0 ;
61         for(i = 1 ; i <= t ; i++)
62             if (num[i] > Max)
63                Max = num[i] ;
64         printf("%d\n" , Max) ;
65
66     }
67     return 0;
68 }

时间: 2024-10-28 11:21:35

hdu 1856 求集合里元素的个数 输出最大的个数是多少的相关文章

!HDU 5317 求区间里两个数的质因数个数的gcd的最大值-预处理

题意:设一个数i的质因数个数为F(i),现给你一个区间[l~r],求max(F[i],F[j])  数据范围:10^6 分析: 预处理出所有的F[i],O(nlgn),10^6不会超时:然后查询用O(7),查询不能用O(n),因为有多个查询会超时. 区间问题减少查询时间复杂度多半类似一个区间的和用两个前缀和相减的方式,前缀和可以在预处理的时候计算,然后区间查询是用两个前缀和相减就行了.如sum[l~r]=sum[r]-sum[l-1],再比如之前的什么我想不起来一时,想起来加上. 代码: #in

集合中的类型转化 以及求集合中元素的最大值,平均值

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace 集合的小练习 { class Program { static void Main(string[] args) { //创建一个集合,里面添加一些数字,求平均值以及和,最大值. ArrayLis

44.从键盘输入12个数存入二维数组a[3][4]中,编写程序求出最大元素的值及它所在的行号和列号

//1.建立二维数组 //2.运用循环,将内容输入到数组中 //3.求出最大元素,并输出行号和列号 #include<iostream> using namespace std; int main() { int a[3][4]; int Max=0;//赋值之前需要先置为0 cout<<"please input 12 numbers: "<<endl; for(int i=0;i<3;i++)//嵌套循环,用于向二维数组中输入内容 { fo

从两个List集合里找到相同部分和不同部分

/** * 获取两个集合里元素不同的部分 */ public List<User> getDifferent(List<User> u1, List<User> u2) { //定义两个空集合 List<User> allUsers = new ArrayList<>(); List<User> differentUsers = new ArrayList<>(); allUsers.addAll(u1); allUser

poj 1611 求0号结点所在集合的元素个数

求0号结点所在集合的元素个数 Sample Input 100 42 1 25 10 13 11 12 142 0 12 99 2200 21 55 1 2 3 4 51 00 0Sample Output 411 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # inc

HLG 1710 给出三个集合a,b,c,统计集合a元素+集合b中元素=集合c中的元素的个数 (基础题)

链接: http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1710 Description 有A. B. C 三个集合的,其中a∈A, b ∈ B, c ∈ C,求有多少种方式使得a + b = c. Input 有多组测试数据,请处理到文件结束. 对于每组测试数据,有三行: 第一行为A集合的描述,第一个数为n,表示A集合有n个数,接下来有n个整数a1~an. 第二行为B集合,第三行为C集合,表

求集合元素的所有非空子集

现有一个包含N个元素的集合S,求集合S的所有子集? 例如:集合S包含三个元素{a, b, c},则它的所有子集为:{ }(空集), {a}, {b}, {c}, {a, b}, {a, c}, {b, c} 和{a, b, c}. 这里先用位操作的思路来求解,具体方法:用2进制Bit位来标记集合中的某个元素是否被选中,1代表选中,0代表未选中.例如集合{a, b, c}的所有子集可如下表示: {a}                       0 0 1 {b}                 

有一个集合,判断集合里有没有“world”这个元素,如果有,添加“javaee”

// 有一个集合,判断集合里有没有"world"这个元素,如果有,添加"javaee" List list = new ArrayList(); list.add("world"); list.add("java"); list.add("hello"); //ConcurrentModificationException /*Iterator it = list.iterator(); while(it.

求集合中选一个数与当前值进行位运算的max

求集合中选一个数与当前值进行位运算的max 这是一个听来的神仙东西. 先确定一下值域把,大概\(2^{16}\),再大点也可以,但是这里就只是写写,所以无所谓啦. 我们先看看如果暴力求怎么做,位运算需要给定\(01/10,00,11\)的关系,总共\(8\)种. 如果是暴力的话,我们的方法有两种, 第一种是比较喜闻乐见的, 我们对于当前数\(x\),暴力计算所有存在的数\(a_i\)中,\(x\oplus a_i\)的最大值,这样的复杂度是\(O(2^{16})\)的. 另外一种也是不难考虑到的