Krusksal
传送门
最小生成树板子题
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll N = 1e5 + 7;
inline ll read()
{
ll s = 0, w = 1;
char ch = getchar();
while (ch < 48 || ch > 57)
{
if (ch == '-')
w = -1;
ch = getchar();
}
while (ch >= 48 && ch <= 57)
s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * w;
}
int n , m;
struct node{
int u , v;
ll w;
}edge[N];
bool cmp(node a, node b){
return a.w < b.w;
}
int fa[N];
int find(int x){
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
ll kruskal(){
for(int i = 1 ; i <= n ; i++) fa[i] = i;
sort(edge + 1, edge + 1 + m , cmp);
ll ans = 0;
ll cnt = 0;
for(int i = 1; i <= m ; i++){
ll x = find(edge[i].u);
ll y = find(edge[i].v);
if(x != y){
fa[x] = y;
cnt++;
ans = max(ans , edge[i].w);
}
if(cnt == n - 1) break;
}
if(cnt == n - 1) return ans;
else return -1;
}
int main()
{
cin>>n>>m;
for(int i = 1; i <= m ; i++){
scanf("%lld %lld %lld", &edge[i].u , &edge[i].v , &edge[i].w);
}
cout<<kruskal()<<endl;
return 0;
}
图论 文章被收录于专栏
难顶
