题目来源于CCF CSP
思路分析
- 最小生成树
- 最小生成树中的最大边
代码解析
#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;
}
测试结果