有比较说明一点经验:求最大值有时候不需要把数据求出来后遍历。
注意:最大值的求解和比较的顺序没有关系,所以可以一边求出数据,一边进行比较。【即用设置全局变量maxp的方法解决】
省去最后遍历的步骤。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e7+5;
int pre[maxn];
int re[maxn];
int n;
int a,b;
int foot1,foot2,maxp;
void init()
{
for(int i=0; i<maxn; ++i)
{
pre[i]=i;
re[i]=1;
}
maxp=1;
}
int finds(int x)
{
if(x==pre[x])
return x;
pre[x]=finds(pre[x]);
return pre[x];
}
void unions(int x,int y)
{
foot1=finds(x);
foot2=finds(y);
if(foot1!=foot2)
{
pre[foot2]=foot1;
re[foot1]+=re[foot2];
maxp=max(re[foot1],maxp);
}
}
int main()
{
while(~scanf("%d",&n))
{
init();
for(int i=0; i<n; ++i)
{
scanf("%d%d",&a,&b);
unions(a,b);
}
printf("%d\n",maxp);
}
return 0;
}
【经验】在数据产生时刻记录下来并合理利用可以大大降低时间复杂度。(减少遍历的时间)
尤其是在寻求最值的时候,这是一个值得考虑的方向!