八中还是清新
比较水的一个并查集二分
#include<bits/stdc++.h> using namespace std; struct node{int a,b,c,d;}num[200000]; int f[200000],n,m,k; int find(int x){if(f[x]==x)return x;return f[x]=find(f[x]);} int check(int w) { int ans=0; for(int i=1;i<=n;i++)f[i]=i; for(int i=1;i<=m;i++) if(num[i].c<=w) { int x=find(num[i].a),y=find(num[i].b); if(x!=y){f[x]=y;ans++;} } if(ans<k)return 0; for(int i=1;i<=m;i++) if(num[i].d<=w) { int x=find(num[i].a),y=find(num[i].b); if(x!=y){f[x]=y;ans++;} } if(ans<n-1)return 0; return 1; } int main() { cin>>n>>k>>m; m--; for(int i=1;i<=m;i++)cin>>num[i].a>>num[i].b>>num[i].c>>num[i].d; int l=0,r=30100,ans; while(l<=r) { int mid=(l+r)/2; if(check(mid)){ ans=mid,r=mid-1; } else l=mid+1; } cout<<ans; }