• 九度OJ 1012:畅通工程 (最小生成树)


    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:7052

    解决:3034

    题目描述:

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

    输入:

        测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。 
        注意:两个城市之间可以有多条道路相通,也就是说
        3 3
        1 2
        1 2
        2 1
        这种输入也是合法的
        当N为0时,输入结束,该用例不被处理。

    输出:

        对每个测试用例,在1行里输出最少还需要建设的道路数目。

    样例输入:
    4 2
    1 3
    4 3
    3 3
    1 2
    1 3
    2 3
    5 2
    1 2
    3 5
    999 0
    0
    样例输出:
    1
    0
    2
    998
    来源:
    2005年浙江大学计算机及软件工程研究生机试真题

    思路:

    典型的最小生成树问题。通常有两种方法,Prim算法和Kruskal算法
    两种方法分别更适合于稠密图和稀疏图,个人比较喜欢用后一种方法,通常在算法实现上需结合并查集。

    两种算法介绍可参考博客:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html


    代码:

    #include <stdio.h>
    
    #define M 1000
    
    int count = 0;
    int id[M+1];
    
    void UF(int n)
    {
        for (int i=1; i<=n; i++)
            id[i] = i;
    }
    
    int find(int i)
    {
        return id[i];
    }
    
    void combine(int i, int j, int n)
    {
        int a = find(i);
        int b = find(j);
        if (a == b)
            return ;
        for (int k=1; k<=n; k++)
        {
            if (id[k] == a)
                id[k] = b;
        }
        count--;
    }
    
    int main(void)
    {
        int m, n;
        int a, b;
        int i;
    
        while (scanf("%d", &n) != EOF && n)
        {
            scanf("%d", &m);
            count = n;
            UF(n);
            for (i=0; i<m; i++)
            {
                scanf("%d%d", &a, &b);
                combine(a, b, n);
            }
            printf("%d
    ", count-1);
        }
    
        return 0;
    }


    编程算法爱好者。
  • 相关阅读:
    ubuntu18【合上盖子不休眠】
    linux和windows双系统开机显示 Minimal BASHlike line editingis supported xxxxxx
    Linux下opera不支持h5播放器的解决方法
    linux openjdk路径
    Linux安装redis tar.gz
    dpkg 安装deb文件
    Linux破解Navicat15
    kali设置grub主题
    kali安装git tar.gz
    kali 安装 teamviewer 显示检测到wayland
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5084019.html
Copyright © 2020-2023  润新知