|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
-
复制代码
提示我内存超了,请问应该怎么优化 |
|