# 输出最小生成树权值之和

#include<iostream>
#include<vector>
using namespace std;
//寻找最小边函数
void findMin(vector<int> &A, vector<int>&B, int**G, int**newG) {
int minu, minv;
int min = INT_MAX;
//对A中点遍历寻找邻接边中权值最小的
for (int i = 0; i < A.size(); i++) {
for (int j = 0; j < B.size(); j++) {
if ((G[A[i] - 1][B[j] - 1] < min) && (G[A[i] - 1][B[j] - 1] != 0)) {
minu = A[i];
minv = B[j];
min = G[A[i] - 1][B[j] - 1];
}
}
}
//更新A和B
A.push_back(minv);
for (vector<int>::iterator it = B.begin(); it <= B.end(); it++) {
if (*it == minv) {
B.erase(it);
break;
}
}
//将最小的边加入newG中
newG[minu - 1][minv - 1] = min;
newG[minv - 1][minu - 1] = min;

}

int main() {
//输入 点数n与边数m
int n, m;
cin >> n >> m;
//建立原图G与加入最小边之后的新图newG
int**G = new int*[n];
int**newG = new int*[n];
//初始化G和newG
for (int i = 0; i < n; i++) {
G[i] = new int[n];
newG[i] = new int[n];
for (int j = 0; j < n; j++) {
G[i][j] = 0;
newG[i][j] = 0;
}
}
//输入图中的各条边
for (int i = 0; i < m; i++) {
int a, b, w;
cin >> a >> b >> w;
G[a - 1][b - 1] = w;
G[b - 1][a - 1] = w;
}
//建立向量A记录已加入最小生成树中的点，并从1开始
vector<int> A;
A.push_back(1);
//建立向量B记录图G中未加入最小生成树的点
vector<int> B;
for (int j = 2; j <= n; j++) {
B.push_back(j);
}
//循环执行寻找最小边函数，直到将原图中所有点加入A为止
while (A.size() != n) {
findMin(A, B, G, newG);
}
//计算最小生成树权重之和
int sum = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
sum += newG[i][j];
}
}
sum /= 2;
cout << sum;
return 0;
}

12-01 1万+

02-09 192

04-29 164

12-07 4437

01-02 2111

12-10 145

12-09

07-27 2544

09-27 3083

11-21 2610

11-15 2万+

03-19 83万+

04-14 62万+

03-13 16万+

03-01 14万+

03-08 5万+

03-10 14万+

03-10 20万+

03-12 12万+

03-13 12万+

#### 我入职阿里后，才知道原来简历这么写

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试