并查集(union-find set)hdoj/hdu 1232畅通工程

原创 2011年01月20日 16:35:00

并查集(union-findset)是一种处理不相交集合(disjointsets)的合并、查找的数据结构,一般可用于表示一个图各连通分支结点的集合,用一棵树表示一个集合,每个集合里的结点都有一个共同的组先,比如当前结点为currentnode,则用while(currentnode!=parents(currentnode)){currentnode=parents(currentnode)}(1),可查找到currentnode的祖先,如果某两个结点有共同的祖先,则两个结点在同一连通分支上。但(1)的timecomplexity达到O(h)h为树的高度),这显然不是我们想要的,所以可进行路径压缩,就是每次遍历找到的结点都设为它们的祖先的儿子,那么很多结点的查找可达到O1)的timecomplexity

以上图为并查集的路径压缩

 

hdoj/hdu 1232,是很明显的并查集题,就是求并查集集合的个数,初始化tatal=n-1,若读入边为某个集合里的边就tatal--,最后就可求出结果。

#include <iostream>
#include <cstdio>
using namespace std;
const int MAX=1001;
int map[MAX][MAX];
int f[MAX];
int root;
//int totalrun;
/*int find(int h)
{
    int x=h;
    while(f[x]!=x)
    {
        x=f[x];
        totalrun++;
    }
  
    return x;

}*///没有进行路经压缩的算法
int find(int h)
{
    //totalrun++;
    if(f[h]==h)
    {
      //  cout<<"root "<<h<<endl;
        return h;
    }
    else
    {
        f[h]=find(f[h]);//路经压缩

        return f[h];
   }
   
}
int main()
{
   
    int n,m;
    int i;
    int from,to;
    int total;
    while(scanf("%d",&n))
    {
        //totalrun=0;
            if(n==0)
                break;
            scanf("%d",&m);
             for(i=1;i<=n;i++)
             {
                 f[i]=i;
             }//初始化每个结点的根结点都是自已本身
             total=n-1;
            for(i=0;i<m;i++)
            {

                scanf("%d %d",&from,&to);
                int r1,r2;
                r1=find(from);//
                r2=find(to);//并查集,每个连通分支表示一棵树,每棵树对应一个根结点,find(x),表示查找当前用树表示的集合里的根结点
                if(r1!=r2)
                {
                    f[r1]=r2;//如果不在同一连通分支上,就将r1设为r2的儿子,r1的集合就与r2合并,根结点为r2
                //    f[r2]=r1;
                    total--;

                }//如果from,to有不同的连通分量,就加一条边
       
            }
            printf("%d/n",total);
           // cout<<"totalrun "<<totalrun<<endl;
    }
    return 0;

}

 

ACM-并查集之畅通工程——hdu1232

ACM 并查集 畅通工程 hdu1232 并查集理解
  • lx417147512
  • lx417147512
  • 2014年04月16日 09:21
  • 2389

HDU1232 畅通工程 并查集

这题是并查集的简单运用。我所利用的并查集没有经过优化。只用到了初始化(每个元素都是一个集合)、查找(某个 元素所在的集合,集合以根节点标志)、合并(两集合不属于同一集合则合并) 这题的主要思想在于...
  • Lulipeng_cpp
  • Lulipeng_cpp
  • 2012年06月25日 11:03
  • 4969

HDU1232——畅通工程(并查集)

Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只...
  • blue_skyrim
  • blue_skyrim
  • 2015年12月04日 18:32
  • 1356

HDU/HDOJ 1232 超详细题解(并查集入门教程)

城市之间由道路连接,相连的城市可以看做一个集合,如:a、b相连,c、d相连,则a和b属于集合A,c和d属于集合B。之后又有人告诉你b和e相连,那么就把e加入到集合A中,以此类推。然后不同集合若是想组成...
  • xdz78
  • xdz78
  • 2015年08月05日 14:29
  • 998

杭电acm1232 hdu-acm-1232畅通工程解题报告

题目地址链接
  • yangjing1003004612
  • yangjing1003004612
  • 2014年08月04日 22:33
  • 553

1232畅通工程(并查集)

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submissio...
  • qq_34594236
  • qq_34594236
  • 2016年07月05日 21:59
  • 351

HDU1233 还是畅通工程(并查集)

思路:考虑的是并查集,还有贪心算法中的克鲁斯卡尔算法,考虑的时候要借助 贪心算法还有并查集,建立树的概念,通过寻找父节点,看是否是满足的父节点,然后进行一些列的判断求解。 #include #inc...
  • a197p
  • a197p
  • 2015年05月27日 14:03
  • 601

hdu/hdoj 1232 畅通工程---并查集

畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi...
  • xiaozhuaixifu
  • xiaozhuaixifu
  • 2013年08月07日 20:26
  • 1120

hdoj 1232 畅通工程【并查集】

畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub...
  • nailnehc
  • nailnehc
  • 2015年08月24日 15:03
  • 210

hdoj 1232 畅通工程 【并查集】

策略: 如题。 并查集:并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。 说白了就是点的合并与查询。 题目链接  http://acm.hdu.ed...
  • shengweisong
  • shengweisong
  • 2014年08月02日 21:29
  • 608
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:并查集(union-find set)hdoj/hdu 1232畅通工程
举报原因:
原因补充:

(最多只允许输入30个字)