• 图3(公路建设)


    题目描述

    有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。

    输入

    输入包含多组数据,格式如下。

    第一行包括两个整数n m,代表城市个数和可以修建的公路个数(n <= 100, m <=10000)。剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。

    输出

    每组输出占一行,仅输出最小花费。

    示例输入

    3 2

    1 2 1

    1 3 1

    1 0

    示例输出

    2

    0

    #include"iostream"
    #include"string"
    #define MAXINT 999999
    using namespace std;
    typedef int element;
    
    class Graph{
    private:
        element *vertex;
        int **arcs;
        int vernum,arcnum;
    public:
        Graph(int vernum,int arcnum){
            this->vernum = vernum;
            this->arcnum = arcnum;
            vertex = new element[vernum];
            arcs = new int*[vernum];
            for(int i = 0;i < vernum;i++){
                arcs[i] = new int[vernum];
                for(int j = 0;j < vernum;j++){
                    arcs[i][j] = MAXINT;
                }
            }
        }
        void cinCreate(){
            for(int i = 0;i < vernum;i++){
                vertex[i] = i + 1;
            }
            int v1,v2,w;
            for(i = 0;i < arcnum;i++){
                    cin>>v1>>v2>>w;
                    arcs[v1 - 1][v2 - 1] = w;
                    arcs[v2 - 1][v1 - 1] = w;
            }
        }
        int minTree(){
            int v0 = 0;        //起点
            int *v = new int[vernum];        //记录是否遍历过
            int *path = new int[vernum];    //连接各点的最短权值
            //初始化
            for(int i = 0;i < vernum;i++){
                v[i] = 0;
                path[i] = arcs[v0][i];
            }
            v[v0] = 1;
            for(int j = 1;j < vernum;j++){
                //求最小路径
                int min = MAXINT,k;
                for(i = 0;i < vernum;i++){
                    if(!v[i] && min > path[i]){
                        min = path[i];
                        k = i;
                    }
                }
                v[k] = 1;
                //刷新path
                for(i = 0;i < vernum;i++){
                    if(!v[i] && path[i] > arcs[k][i]){
                        path[i] = arcs[k][i];
                    }
                }
            }
            int sum = 0;
            for(i = 0;i < vernum;i++){
                if(path[i] != MAXINT){
                    sum += path[i];
                }
            }
            delete[] v;
            delete[] path;
            return sum;
        }
    };
    /*
    
    6 10
    1 2 6  1 3 1  1 4 5  2 5 3  4 6 2  2 3 5  3 4 5  3 6 4  3 5 6  5 6 6
    */
    int main(){
        int a,b;
        cin>>a>>b;
        Graph g(a,b);
        g.cinCreate();
        cout<<g.minTree()<<endl;
        return 0;
    }
  • 相关阅读:
    【索引】SyntaxHighlighter 使用参考
    【索引】博客心得
    SyntaxHighlighter 使用参考(一) 概述
    PEGA 十合一吉他控制器连接电脑玩《吉他英雄3》
    从SourceForge上获取CVS管理的开源代码
    从SourceForge上获取SVN管理的开源代码
    整数哈希介绍
    回文时间
    D2js 是如何处理并发的
    Windows 安装JRuby 生成 war 到 tomcat 运行
  • 原文地址:https://www.cnblogs.com/oleolema/p/9038015.html
Copyright © 2020-2023  润新知