HDU ACM 1856 More is better->并查集

解析:又是一个并查集。

1、题意:王老师需要一些男生帮他做事。要求男生之间都是朋友关系,可以直接的,也可以间接地。最多可以挑选出几个男生(最少挑一个)?

2、并查集,求所有集合中最大集合的元素个数。

3、要注意一个地方是:当n=0时,要输出1。

#include<iostream>
#include<algorithm>
using namespace std;

int p[10000001],num[10000001];

bool Init(int n)                //一开始指向自己
{
	for(int i=0;i<=10000000;i++)
	{
		p[i]=i;
		num[i]=1;               //一开始每个集合都只有一个元素
	}
	return true;
}

int Find(int x)            //找到根节点
{
	int r,i,j;

	r=x;
	while(r!=p[r]) r=p[r];      //路径压缩准备,找到根节点

	i=x;
	while(i!=p[i])
	{
		j=p[i];
		p[i]=r;
		i=j;
	}
	return i;                 //返回根节点
}

bool Merge(int x,int y)      //返回是否需要合并
{
	int tx,ty;

	tx=Find(x);
	ty=Find(y);

	if(tx==ty) return false;
	p[tx]=ty;
	num[ty]+=num[tx];              //合并集合元素个数
	return true;
}

int main()
{
	int n,a,b,max,i,maxnum;

	while(scanf("%d",&n)==1)
	{
		Init(n);
		maxnum=0;
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&a,&b);
			maxnum=maxnum>a?maxnum:a;
			maxnum=maxnum>b?maxnum:b;
			Merge(a,b);
		}
		max=1;              //注意0个时也为1
		for(i=1;i<=maxnum;i++)
			if(max<num[i])
				max=num[i];

		printf("%d\n",max);;
	}
    return 0;
}
时间: 2024-12-25 10:39:17

HDU ACM 1856 More is better->并查集的相关文章

HDU ACM 1272 小希的迷宫-&gt;并查集

分析:题意是判断是不是连通无环的图,使用并查集可以很好的解决. 1.判断是否成环,只需判断输入边的两个点.有共同的祖先,那么这两点就成环. 2.判断是否连通,只要判断根节点数为1即可. 3.注意:当输入数据只有0 0时,也是满足条件的,应输出 "Yes". #include<iostream> #include<algorithm> using namespace std; int p[100001]; bool Init(int n) //一开始指向自己 {

HDU 3367 Pseudoforest(伪森林)(并查集)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3367 题意:在图论中,如果一个森林中有很多连通分量,并且每个连通分量中至多有一个环,那么这个森林就称为伪森林. 现在给出一个森林,求森林包含的最大的伪森林,其大小通过所有边的权值之和来比较. 分析: 1.一开始想的是:在每个连通分量中求一个最大生成树,然后加一条最大的边,再把每个连通分量算出来的值加起来,但WA了.这并不是最优的,因为还存在这种情况:一个连通分量里最初有两个环,但是伪森林要求最多一个

HDU 3081Marriage Match II(二分+并查集+网络流之最大流)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3081 有一段时间没写最大流的题了,这题建图居然想了好长时间...刚开始是按着最终的最大流即是做多轮数去想建图,结果根本没思路,后来想了想,可以用二分答案的思想来找最终答案.然后很明显的并查集,但是并查集学的略渣,居然卡在并查集上了..= =. 但是也不是并查集的事..是我建图的思想太正了,稍微用点逆向思维并查集就可以很好利用了. 建图思路是:建立一个源点与汇点,将女孩与源点相连,男孩与汇点相连,权值

hdu 1829 A Bug&#39;s Life 并查集

点击打开链接 http://acm.hdu.edu.cn/showproblem.php?pid=1829 题意:给出n个关系啊a,b,表示a和b是异性,问是否存在矛盾,即存在a和b是同性. 思路,并查集,用f[i]记录i的父亲,next[i]表示同一个集合里的下一个元素,根据next数组可以遍历出一个集合里的所有元素,len[i]表示i和集合的根的关系,0表示同性,1表示异性. 每输入一个a和b,找到他们的根,如果根相等,那么就判断他们和根的关系,如果和根都是同性关系或者都是异性关系,则表示a

HDU 3047 Zjnu Stadium 带权并查集

题目来源:HDU 3047 Zjnu Stadium 题意:给你一些人 然后每次输入a b c 表示b在距离a的右边c处 求有多少个矛盾的情况 思路:用sum[a] 代表a点距离根的距离 每次合并时如果根一样 判断sum数组是否符合情况 根不一样 合并两棵树 这里就是带权并查集的精髓 sum[y] = sum[a]-sum[b]+x 这里y的没有合并前b的根 #include <cstdio> #include <cstring> using namespace std; cons

[ACM] POJ 3295 Ubiquitous Religions (并查集)

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23093   Accepted: 11379 Description There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in findi

hdu 1829 A Bug&#39;s Life 并查集系列

1 #include "cstdio" 2 #include "iostream" 3 #include "cstring" 4 #include "vector" 5 #include "queue" 6 using namespace std; 7 8 #define MAXN 2222 9 int fa[MAXN]; 10 int rnk[MAXN]; //秩 表示某点与根的距离 11 int n,

hdu 1272 小希的迷宫(简单并查集)

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 31396    Accepted Submission(s): 9726 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是

POJ 2492 || HDU 1829:A Bug&#39;s Life(并查集)

传送门: POJ:点击打开链接 HDU:点击打开链接 A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 27624   Accepted: 8979 Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they fe

HDU 1232:畅通问题(并查集)

畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 29362    Accepted Submission(s): 15452 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有