CCF CSP201812-4数据中心

题目来源于CCF CSP


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


思路分析

  1. 最小生成树
  2. 最小生成树中的最大边

代码解析

#include<iostream>
#include<algorithm>
using namespace std;
const int Max = 100000;
struct Edge {
    
    
	int start;
	int end;
	int cost;
}edge[Max];
int father[Max];

//查找父节点
int find_father(int point) {
    
    

	if (point != father[point]) {
    
    
		father[point] = find_father(father[point]);
		return father[point];
	}
	else
		return  point;
}
int main()
{
    
    
	int n; //节点数
	cin >> n;
	int m;  //边数
	cin >> m;
	int root;   //根节点的值
	cin >> root;
	int start, end, cost,ans = 0;
	for(int i = 0;i < m;++i){
    
    
		cin >> start >> end >> cost;
		edge[i] = {
    
     start,end,cost };
	}
	//初始化父节点
	for (int i = 1; i <= n; ++i)
		father[i] = i;
	//从小到大排序
	sort(edge, edge + m, [](const Edge &a, const Edge& b) {
    
    
		return a.cost < b.cost;
	});
	//最多连接边数(n - 1)
	int edge_num = 0;
	for (int i = 0; i < m; ++i) {
    
    
		//找源节点
		start = find_father(edge[i].start);
		end = find_father(edge[i].end);
		//当属于不同的源节点时
		if (start != end) {
    
    
			father[end] = start;
			ans = edge[i].cost;
			++edge_num;
			if (edge_num == n - 1)
				break;
		}
	}
	cout << ans << endl;
}

测试结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44116998/article/details/108286730