图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;
}
原文地址:https://www.cnblogs.com/oleolema/p/9038015.html