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;
}