马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
问题描述
王希望一些男孩帮他做一个项目。因为这个项目相当复杂,<b>来的男孩越多越好</b>。当然也有一些要求<br><br>王先生选了一个足够大的房间来容纳孩子们。未被选中的男孩必须立即离开房间。房间里有10000000个男孩,一开始的数字从1到10000000。经过王先生的挑选,他们中任何两个仍然在这个房间里的人都应该是朋友(直接或间接),否则就只剩下一个男孩了。考虑到所有的直接朋友配对,你应该决定最好的方式<br>
输入
输入的第一行包含一个整数n(0≤n≤100 000)-直接朋友对的数量。下面的n行分别包含一对数字a和B,由一个空格分隔,这表明a和B是直接的朋友。(A≠B,1≤A,B≤10000000)
输出
一行中的输出正好包含一个整数,等于王可能保留的男孩的最大数量<br>
Sample Input
4
1 2
3 4
5 6
1 6
4
1 2
3 4
5 6
7 8
Sample Output
4
2
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
long long int mer[10000002]={0},max[10000002]={0};
long long int i,a,b,imax;
long long int n;
long long int find(long long int x)
{
if(x!=mer[x])
{
mer[x]=find(mer[x]);
}
max[mer[x]]++;
if(max[mer[x]]>imax) imax=max[mer[x]];
return mer[x];
}
void merge(long long int x,long long int y)
{
long long int fx,fy;
fx=find(x);
fy=find(y);
if(fx!=fy)
{
mer[fx]=fy;
}
}
int main()
{
while(scanf("%lld",&n)!=EOF)
{
memset(max,0,sizeof(max));
imax=0;
for(i=1;i<=10000001;i++)
{
mer[i]=i;
}
while(n--)
{
scanf("%lld%lld",&a,&b);
merge(a,b);
}
printf("%lld\n",imax+1);
}
return 0;
}
提示我内存超了,请问应该怎么优化 |