并查集的题,我的合并不是按高度来的,而是按结点个数来合并的——这可能带来一些方便,不过貌似牺牲了一些时间 :(
我希望了解200MS以内的处理办法,目前没工夫考虑这个优化了,还有一个题待完成 :(
/*
* HDU-1856 more is better
* mike-w
* 2011-8-15
* hint: MFSet
*/
#include<stdio.h>
#define MAXN 1000
long set[MAXN];
int mkset(long size)
{
long* p=set;
while(size-->0)
*p=-1,p++;
return 0;
}
long find(long e)
{
long t1,root;
t1=e;
while(set[t1]>0)
t1=set[t1];
root=t1;
while(set[e]>0)
{
t1=set[e];
set[e]=root;
e=t1;
}
return root;
}
long merge(long e1,long e2)
{
long r1=find(e1),r2=find(e2),ret;
if(r1==r2) /* they have one common root */
return 0;
else if(set[r1]<set[r2]) /* root r1 contains more elements */
ret=(set[r1]+=set[r2]),set[r2]=r1;
else
ret=(set[r2]+=set[r1]),set[r1]=r2;
return ret;
}
int main(void)
{
long n,i,t1,t2,t3,ans=0;
#ifndef ONLINE_JUDGE
freopen("1856.in","r",stdin);
#endif
while(scanf("%ld",&n)!=EOF)
{
mkset(MAXN);
ans=-1;
for(i=0;i<n;i++)
{
scanf("%ld%ld",&t1,&t2);
t3=merge(t1,t2);
ans=(ans<t3?ans:t3);
}
printf("%ld\n",-ans);
}
return 0;
}
本文讨论了并查集的一种优化策略,通过按节点数量合并,减少时间复杂度。结合实例HDU-1856,展示了优化后的并查集在解决实际问题时的效率提升。
344

被折叠的 条评论
为什么被折叠?



