ACM乐园
Love Me,Love My Code!
posts - 53,  comments - 24,  trackbacks - 0

 

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

并查集练习,这是一道很典型的并查集问题,问题是判断图在连通的情况下是否有环。用并查集可以判断是否有环,但怎么判断连通呢?如果图的父节点不止一个则一定不连通,我们就看父节点个数。

#include <iostream>

using namespace std;

int parent[100002];

int UFfind(int i)
{
    
int j;
    
for(j=i;parent[j]>0;j=parent[j]);
    
while(j!=i)
    
{
        parent[i]
=j;
        i
=parent[i];
    }

    
return j;
}


void UFunion(int i,int j)
{
    
int temp=parent[i]+parent[j];
    
if(parent[i]<parent[j])
    
{
        parent[j]
=i;
        parent[i]
=temp;
    }

    
else
    
{
        parent[i]
=j;
        parent[j]
=temp;
    }

}


int main()
{
    
int p,q,c,i,j,a,b;
    
while(scanf("%d%d",&p,&q)!=EOF,!(p==-1&&q==-1))
    
{
        c
=0;
        a
=0;
        b
=p;
        memset(parent,
-1,sizeof(parent));
        
while(!(p==0&&q==0))
        
{
            
if(parent[p]==-1 && parent[q]==-1//如果是两个独立点合并,则根节点数加1
                a++;
            
else
                
if(parent[p]!=-1 && parent[q]!=-1//如果p,q不是同一颗树,合并后根节点数减1,
                                                   
//如果是同一颗树,那么在后面的判断中会把c改为1,不影响后面的结果
                    a--;                           //这样做很巧妙
            i=UFfind(p);
            j
=UFfind(q);
            
if(i!=j)
                UFunion(i,j);
            
else
                c
=1;
            scanf(
"%d%d",&p,&q);
        }

        
if(!&& a==1 || b==0)
            printf(
"Yes\n");
        
else
            printf(
"No\n");
    }

}
posted on 2011-04-26 09:40 大大木马 阅读(762) 评论(3)  编辑 收藏 引用

FeedBack:
# re: HDU 1272
2011-07-07 11:21 | 2010310200828
hao  回复  更多评论
  
# re: HDU 1272并查集判断是否有环
2012-09-21 12:18 | ontseason
判断你要连接的两点的祖先节点是否是同一个就行?  回复  更多评论
  
# re: HDU 1272并查集判断是否有环
2012-09-21 23:17 | 木马
如果是同一个说明他们是连通的@ontseason
  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2014年2月>
2627282930311
2345678
9101112131415
16171819202122
2324252627281
2345678

常用链接

留言簿(1)

随笔档案(53)

文章档案(2)

搜索

  •  

积分与排名

  • 积分 - 62344
  • 排名 - 353

最新评论

阅读排行榜

评论排行榜