#include <bits/stdc++.h>
using namespace std;
const int N=200010;
int bin[5010];
int ans;
int cnt;
struct node{
int u;
int v;
int w;
}a[N];
bool cmp(node a,node b){
return a.w<b.w;
}
int find(int x){
int r=x;
while(r!=bin[r]){
r=bin[r];
}
return r;
}
void merge(int a,int b,int dis){
if(find(a)!=find(b)){
bin[find(a)]=find(b);
ans+=dis;
cnt++;
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++) bin[i]=i;
for(int i=0;i<m;i++) cin>>a[i].u>>a[i].v>>a[i].w;
sort(a,a+m,cmp);
for(int i=0;i<m;i++){
if(find(a[i].u)!=find(a[i].v))
merge(a[i].u,a[i].v,a[i].w);
}
if(cnt==n-1){
cout<<ans<<endl;
}
else {
cout<<"orz"<<endl;
}
return 0;
}
拥挤度最大值最小: 连通时最后一条边的权值
#include <bits/stdc++.h>
using namespace std;
const int N=20010;
int bin[10010];
int ans;
struct node{
int u;
int v;
int w;
}a[N];
bool cmp(node a,node b){
return a.w<b.w;
}
int find(int x){
int r=x;
while(r!=bin[r]){
r=bin[r];
}
return r;
}
void merge(int a,int b){
if(find(a)!=find(b)){
bin[find(a)]=find(b);
}
}
int main(){
int n,m,s,e;
cin>>n>>m>>s>>e;
for(int i=0;i<n;i++) bin[i]=i;
for(int i=0;i<m;i++) cin>>a[i].u>>a[i].v>>a[i].w;
sort(a,a+m,cmp);
for(int i=0;i<m;i++){
merge(a[i].u,a[i].v);
if(find(s)==find(e)){
cout<<a[i].w<<endl;
return 0;
}
}
return 0;
}