求教贴:HDOJ 1856 More Is Better!!!

HDOJ 1856 More Is Better

求教帖 (大一在读回复可能不及时,如果有大佬教的话非常感谢)
原题链接:(http://acm.hdu.edu.cn/showproblem.php?pid=1856)*
Problem Description
王先生想要一些男孩帮他做一个项目。因为这个项目是相当复杂的,男孩来,更好的将。当然有一定的要求。王先生选择一个房间大得足以容纳的男孩。那个男孩不被选择马上离开房间。房间里有10000000男孩编号从1到10000000开头。在王先生的选择其中任意两个仍在这个房间应该朋友(直接或间接),或只有一个男孩离开了。考虑到直接friend-pairs,你应该决定最好的方法。

Input
输入的第一行包含一个整数n(0≤n≤100 000)——直接朋友对的数目。下面的n行各包含一对数字a和B,它们之间用一个空格分隔,表示a和B是直接的朋友。(A≠B, 1≤A, B≤10000000)

Output
一行的输出恰好包含一个整数,这个整数等于王先生可能保留的男孩数的最大值。

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

Sample Output
4
2

最新更新!!
问题解决了
m初始化应该是1而不是0(代码没有改,想直接crl+c+v的注意改一下)
就是这个
(如果没有伙伴的话应该还剩下一个人。。以后这种界值要多加注意)
然后非常感谢群里的大佬们(顺便祝cf顺利)

简单并查集
写了半天还是TLE
在论坛上找了答案改了一下,但是还是不对
真的要崩溃了。。。
##已更新代码
上次是cin和scanf的问题(这个以后看看再写一篇吧)
改好之后直接wa
还是不懂啊!!!!
求大佬指点*
我的代码如下:

#include<iostream>
#include<cstring>
using namespace std;
const int N = 10000005;
int bin[N];
int c[N];
int m;
int findx(int p)
{
	int r = p;
	while (r != bin[r])
		r = bin[r];
	int i = p, j;
	while (i != r)
	{
		j = bin[i];
		bin[i] = r;
		i = j;
	}
	return r;
}
void mergy(int x, int y)
{
	int fx = findx(x);
	int fy = findx(y);
	if (fx != fy)
	{
		bin[fx] = fy;
		c[fy] += c[fx];
		if (c[fy] > m)
			m = c[fy];
	}
}
void intl()
{
	for (int i = 0; i < N; i++)
	{
		bin[i] = i;
		c[i] = 1;
	}
}
int main()
{
	int n;//关系数
	int a, b;
	while (scanf("%d",&n)!=EOF)
	{
		intl();
		m = 0;
		while (n--)
		{
			scanf("%d %d", &a, &b);
			mergy(a, b);
		}
		cout << m << endl;
	}
	return 0;
}

查到的代码如下(特别感谢 @深海零娄 的答案)
(如有侵权请联系,立删)
转载地址:https://blog.csdn.net/ls158390/article/details/88962431


```cpp
#include<cstdio>
#include<cmath>
#include<algorithm>
#define N 10000005
int pre[N],mark[N],countt;
using namespace std;
int find(int x)
{
	int r=x;
	while(pre[r]!=r)
	r=pre[r];
	
	int i=x,j;
	while(i!=r)
	{
	 j=pre[i];
	 pre[i]=r;
	 i=j;
	}
	return r;
}

void init()
{
	for(int i=0;i<=N;i++)
	{
		pre[i]=i;
		mark[i]=1;
	}
}

void mix(int a,int b)
{
	int fx=find(a);
	int fy=find(b);
	if(fx!=fy)
	{
	  pre[fx]=fy;
	  mark[fy]+=mark[fx];//记录每棵树的节点数
	 
	 if(mark[fy]>countt)
	 countt=mark[fy];	
	}	
}

int main()
{
	int t,p1,p2;
	while(scanf("%d",&t)!=EOF)
	{
		countt=1;
		init();
		while(t--)
		{
			scanf("%d %d",&p1,&p2);
			mix(p1,p2);
		 }
	     printf("%d\n",countt);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值