关闭

hdu 1856 并查序 特殊优化

175人阅读 评论(0) 收藏 举报
分类:
#include <stdio.h>
#include<string.h>
int c[10000005],k[10000005];
int find(int x)
{
	int y = x;
    while(x!=c[x])
        x=c[x];
    c[y] = x;//如果没有这一步,就会超时。 对于很大的树,这是一个非常优秀的优化
    return x;
}
int main()
{
    int n,m,i,a,b,p,q;
    while(scanf("%d",&n)!=EOF)
    { 
		m=1;
		 for(i=1;i<=10000000;i++)
        { c[i]=i ;k[i]=1; }
        
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&a,&b);
            p = find(b); q = find(a);
            if(p == q) continue;
            k[p]=k[q]+k[p];
            c[q]=p;
            if(m<k[p])m=k[p];
        }
        printf("%d\n",m);
    }
    return 0;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:41727次
    • 积分:1414
    • 等级:
    • 排名:千里之外
    • 原创:94篇
    • 转载:4篇
    • 译文:0篇
    • 评论:14条
    最新评论