本题思路
题意相当于:生成一棵树,要求这棵树的最长边最短,并求这条最长边的长度。
Kruskal算法的模板题:首先对边进行排序,随后从小到大选取边,最终得到一棵生成树。贪心的做法使得每次选取的边都是最小的,且符合题意。
满分代码(C++11)
#pragma GCC optimize(3, "Ofast", "inline")
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
struct Edge
{
int begin, end, length;
bool operator<(const Edge &a)
{
return length < a.length;
}
Edge(int a, int b, int c) : begin(a), end(b), length(c) {}
};
int n, m, root;
int parent[50005];
vector<Edge> edges;
void make_set()
{
for (int i = 0; i < n; ++i)
parent[i] = i;
}
int find_set(int x)
{
return (x == parent[x]) ? x : parent[x] = find_set(parent[x]);
}
void union_set(int x, int y)
{
x = find_set(x);
y = find_set(y);
parent[x] = y;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> root;
int a, b, c;
for (int i = 0; i < m; ++i)
{
cin >> a >> b >> c;
edges.emplace_back(a, b, c);
}
sort(edges.begin(), edges.end());
make_set();
int cnt = 0, longest = -1;
for (Edge &e : edges)
{
if (cnt == n - 1)
break;
if (find_set(e.begin) != find_set(e.end))
{
union_set(e.begin, e.end);
longest = max(longest, e.length);
++cnt;
}
}
cout << longest;
return 0;
}
如果对您有帮助记得点个赞哦~