<SPAN id="tt_tagDIV" style="word-break:break-all" class="tt_title">RPG Girls</SPAN>
RPG Girls
 
Rabbit Princess Grass!!!
 
 
    最新日志
·七种qsort排序方法 [转...(2006-09-24)
·Factstone Benc...(2006-09-20)
·N!问题(2006-09-17)
·毛毛,还我香蕉!!!(2006-09-15)
·小希的迷宫HDU1272(2006-09-14)
·用电脑最容易被忽视的18个危...(2006-09-13)
·1024 Max Max S...(2006-09-13)
·G要歇菜了! [原](2006-09-08)
·Last non-zero ...(2006-09-08)
·计算交点数HDU1466(2006-09-07)
·装错信封问题(2006-09-07)
·猜猜他们是谁~?~(2006-09-06)
·我们的第一次 [原](2006-09-06)
·RP不好啊!(2006-09-06)
·我们在一起 [原](2006-09-06)
·关于浮点数的存储 [转](2006-09-06)
·取石子游戏HDU1527 [...(2006-09-05)
    历史档案
    最新评论
wujita01/2008-04-04
ddddddddd....
访客/2008-01-12
ft
Louis.G/2007-09-27
你的解法基于划分,....
毛毛的同学(访客)/2007-04-30
晕死,我问毛毛这个....
不在现场(访客)/2007-02-06
这条公式到底是啥用....
Speakless(访客)/2006-11-17
这题都有..呵呵....
linle(访客)/2006-09-28
貌似楼上(还是楼下....
blogkid(访客)/2006-09-27
如果我没记错的话,....
草儿 (lasiazhang)/2006-09-24
为什么我贴的代码都....
访客857690/2006-09-09
恩,下次记得给我带....
访客429047/2006-09-08
可怜的人啊。。早知....
huangwei1024 (威士忌)/2006-09-07
欧拉原来是瑞士数学....
huangwei1024 (威士忌)/2006-09-06
不错不错
比我的好看....
访客913273/2006-09-06
恭喜RPG开张~

B....
访客772200/2006-09-06
挖哈哈哈哈哈,我是....
    友情链接
    我的LOGO
 
++月亮公主     加为好友   给我消息
性别:积分:
来自:年龄:19岁
小希的迷宫HDU12722006-09-14 14:39:31
标签:缩起正文  字号: 

http://acm.hziee.edu.cn/showproblem.php?pid=1272

并查集的典型用法。
如果只是单纯的找根和压缩路径,用递归的方法会栈溢出,用两个循环则会超时。
贴上乐乐的程序。他用负数表示树的根,而负数的大小就是树的深度。在两棵树合并是,先比较它们深度,把深度小的那一棵树直接连到深度大的根上,实现相对平衡。
#include "stdio.h"
#include "memory.h"
int bin[100004];
int point,edge;
int getit(int x)
{
    if(bin[x] <= 0)
        return x;
    else return bin[x]=getit(bin[x]);
}
int join(int a,int b)
{
    int fa,fb;

    fa=getit(a);
    fb=getit(b);

    if(fa==fb)
        return -1;

    edge++;
    if(bin[fa]==0 && bin[fb]==0)
    {
        point+=2;
        bin[fa]=-1;
        bin[fb]=fa;
    }
    else if(bin[fa]==0 && bin[fb]!=0)
    {
        bin[fa]=fb;
        point++;
    }
    else if(bin[fa]!=0 && bin[fb]==0)
    {
        bin[fb]=fa;
        point++;
    }
    else
    {
        if(bin[fa]==bin[fb])
        {
            bin[fa]=fb;
            bin[fb]--;
        }
        else if(bin[fa]<bin[fb])
        {
            bin[fb]=fa;
        }
        else
        {
            bin[fa]=fb;
        }
    }
    return 1;
}
int main()
{
    int a,b;
    int flag;
    while(scanf("%d %d",&a,&b),a!=-1)
    {
        if(a==0 && b==0)
        {
            printf("Yes\n");
            continue;
        }
        memset(bin,0,sizeof(bin));
        point=0;
        edge=0;
        join(a,b);
        flag=1;
        while(scanf("%d %d",&a,&b),a||b)
        {
            if(flag==1)
            {
                if(join(a,b)==-1)
                {
                    flag=0;
                }
            }    
        }
        if(flag==0 || point!=edge+1)
            printf("No\n");
        else printf("Yes\n");    
    }
    return 0;
}

回复() | 人气() | 引用() | 推荐 | 保存日志 | 问题日志 | 收藏到网摘 | 返回圈子首页
 
 
博客主页 博客主页 FAQ帮助 注册 退出