原题链接:https://www.acwing.com/problem/content/1144/
这个条件在告诉我们要求一个生成树。
解题思路:
普通的最小生成树:所有边权之和最小
本题的最小生成树:最大的边权最小
在这里我深刻的意识到kruskal本质是让点按照某个规律进行连通,res只不过是特有的属性。由于排序完之后,我们每次都是找最小的边进行联通,一旦全部联通我们就会停止,这样最后联通的那条边,就是我们想要的答案。
// 最小生成树的变形,问的不是边权总和,而是最后
// 一个加入的边
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 310, M = 10010;
int n, m;
struct Edge
{
int a, b, w;
bool operator< (const Edge &t) const
{
return w < t.w;
}
}e[M];
int p[N];
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ ) p[i] = i;
for (int i = 0; i < m; i ++ )
{
int a, b, w;
cin >> a >> b >> w;
e[i] = {a, b, w};
}
sort(e, e + m);
int res = 0;
for (int i = 0; i < m; i ++ )
{
int a = find(e[i].a), b = find(e[i].b), w = e[i].w;
if (a != b)
{
p[a] = b;
res = w;
}
}
cout << n - 1 << ' ' << res << endl;
return 0;
}