zoukankan      html  css  js  c++  java
  • 题目1012:畅通工程(并查集)

    问题来源

      http://ac.jobdu.com/problem.php?pid=1012

    问题描述

      一共有编号1~n的n个城市,只有m条道路把他们连起来,问至少还需要多少条道路,才能让所有城市都连在一起。

    问题分析

      或许还没有了解接触过并查集,但我们看到这个问题,一定想得到这个问题大概怎么解决:连在一起的城市都看作一个点,孤立的城市也是一个点,如果我们能算出最后的点数cnt,那么答案就是cnt-1了。其实这就是并查集的一种简单思考应用。

      简单来讲,并查集就是“合并集合”和“查询集合”,首先会存在一组不相交的动态集合 S={S1,S2,,Sk}最开始每个点作为一个集合,它的boss就是他自己,随着边的加入,集合之间合在一起变为一个较大集合,他们有共同的boss,最后我们只要计算boss有多少个就可以了。

      并查集的应用,用并查集联立m对已经联通的城镇,再查看孤立城镇有多少个即可。

      想了解更多并查集知识,请参考:http://www.cnblogs.com/AlvinZH/p/6800789.html

    参考代码

    //
    // Created by AlvinZH on 2017/5/3.
    // Copyright (c) AlvinZH. All rights reserved.
    //
    
    #include <cstdio>
    #define N 1000
    int uset[N];
    
    void makeSet(int size)//操作一:建立并查集
    {
        for(int i=1;i<=size;i++)
            uset[i]=-1;
    }
    int find(int x)//递归
    {
        if(uset[x]==-1) return x;
        else
        {
            uset[x]=find(uset[x]);
            return uset[x];
        }
    }
    int main()
    {
        int n,m;
        while(~scanf("%d",&n)&&n!=0)
        {
            scanf("%d",&m);
            makeSet(n);
    
            while(m--)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                a=find(a);
                b=find(b);
                if(a!=b) uset[a] = b;//简单合并
            }
    
            int ans = 0;
            for(int i=1;i<=n;i++)
                if(uset[i]==-1)
                    ans++;
    
            printf("%d
    ",ans-1);
        }
        return 0;
    }

    作者: AlvinZH

    出处: http://www.cnblogs.com/AlvinZH/

    本人Github:https://github.com/Pacsiy/JobDu

    本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    HTML5和HTML4之间的区别
    HttpRequest信息内容介绍
    Spring Web MVC处理请求的流程
    游戏中的路径动画设计与实现
    Python基本数据类型
    Python基本数据类型
    perl .= 操作符
    出差二、三事——北漂18年(25)
    perl 卸载Oracle数据库
    perl 卸载mysql数据库
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/6800897.html
Copyright © 2011-2022 走看看