zoukankan      html  css  js  c++  java
  • 还是畅通工程,最小生成树kruskal

    题目描述:
        某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
    输入:

        测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
        当N为0时,输入结束,该用例不被处理。

    输出:

        对每个测试用例,在1行里输出最小的公路总长度。

    样例输入:
    3
    1 2 1
    1 3 2
    2 3 4
    4
    1 2 1
    1 3 4
    1 4 1
    2 3 3
    2 4 2
    3 4 5
    0
    样例输出:
    3
    5

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int path[101];
    
    struct edge{
        int a,b,cost;
        bool operator <(const edge &A) const{
            return cost<A.cost;
        }
    }edge[5000];
    
    
    int findroot(int a){
        int temp=a;
        while (path[a] != -1){
            a=path[a];
        }
        int temp2;
        //改进,使树的高度变矮,宽度增加,方便找根 
        while (path[temp]!= -1){
            temp2=path[temp];
            path[temp]=a;
            temp=temp2;
        }
        return a;
    }
    
    int main (){
        int n;
        while (cin>>n && n!=0){
            int nn=n*(n-1)/2;
            for (int i=1;i<=n;i++){
                path[i]=-1; 
            }
            int ans=0;
            for (int i=1;i<=nn;i++){
                cin>>edge[i].a>>edge[i].b>>edge[i].cost;
            }
            sort(edge+1,edge+1+nn);
            int a,b;
            for (int i=1;i<=nn;i++){
                a=edge[i].a;
                b=edge[i].b;
                a=findroot(a);
                b=findroot(b);
                if (a!=b){
                    path[a]=b;
                    ans += edge[i].cost;
                } 
            }
    
            cout<<ans<<endl;
        } 
        return 0;
    }

    最小生成树,运用了上一节并查集的知识。

    具体如下

  • 相关阅读:
    CentOs图形界面的开启与关闭
    在CentOS上安装ZooKeeper集群
    CentOs中mysql的安装与配置
    CentOS 6.5 下安装 Redis 2.8.7
    apt-get 与 yum的区别 (转)
    centos 命令大全
    ctrl+c,ctrl+d,ctrl+z在linux中意义
    Jedis 例子(demo)大全
    gradle init.gradle的文件配置 使用
    Java使用Jetty实现嵌入式Web服务器及Servlet容器
  • 原文地址:https://www.cnblogs.com/yexiaoqi/p/7233988.html
Copyright © 2011-2022 走看看