输出最小生成树权值之和

#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;
}

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读