BZOJ1196: [HNOI2006]公路修建问题


八中还是清新

比较水的一个并查集二分


#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;
}
原文地址:https://www.cnblogs.com/SFWR-YOU/p/11838743.html