zoukankan      html  css  js  c++  java
  • hdu 1232 畅通工程(并查集)

    最简单的并查集题了吧!

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?  

    本题只需将联通的村庄联系在一起而已!


    #include<stdio.h>



    int pre[1010];


    int find(int k)
    {
    if(k==pre[k])
    return k;
    pre[k]=find(pre[k]);
    return pre[k];
    }


    int main()
    {
    int n,m,i,a,b,f1,f2,ans;
    while(scanf("%d",&n),n)
    {
    scanf("%d",&m);
    for(i=1;i<=n;i++)
    pre[i]=i;
    for(i=0;i<m;i++)
    {
    scanf("%d %d",&a,&b);
    f1=find(a);
    f2=find(b);
    if(f1!=f2)
    pre[f1]=f2;
    }
    ans=0;
    for(i=1;i<=n;i++)
    if(i==pre[i])
    ans++;
    printf("%d ",ans-1);
    }
    return 0;
    }

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232



    并查集:

    定义


    并查集是一种树型的 数据结构,用于处理一些不相交 集合(Disjoint Sets)的合并及查询问题。常常在使用中以 森林来表示。
    集就是让每个元素构成一个单元素的 集合,也就是按一定顺序将属于同一组的 元素所在的集合合并。

    初始化

    把每个点所在 集合初始化为其自身。
    通常来说,这个 步骤在每次使用该 数据结构时只需要 执行一次,无论何种实现方式, 时间复杂度均为O(N)。

    查找

    查找元素所在的 集合,即根节点。

    合并

    将两个元素所在的 集合合并为一个集合。
    通常来说,合并之前,应先判断两个元素是否属于同一 集合,这可用上面的“查找”操作实现。
  • 相关阅读:
    CSS:CSS 创建
    mfs-用户
    java实现扑克牌移动
    java实现扑克牌移动
    java实现扑克牌移动
    java实现纵横火柴棋
    java实现纵横火柴棋
    java实现纵横火柴棋
    java实现纵横火柴棋
    java实现纵横火柴棋
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3243832.html
Copyright © 2011-2022 走看看