公路修建问题(二分答案+生成树)

#include<iostream>

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<cmath>

using namespace std;

const int maxn=4*1e4+10;

int fa[maxn],l,r,n,m,num,cnt,k;

struct edge{

    int x,y,w,cur;

}s[maxn];

bool cmp(edge a,edge b){

    if(a.cur!=b.cur) return a.cur<b.cur;

    return a.w<b.w;

}

int find(int x){

    return fa[x]==x?fa[x]:fa[x]=find(fa[x]);

}

bool check(int x){

    num=0; int f=0,num1=0;

    for(int i=1;i<=n;i++) fa[i]=i;

    for(int i=1;i<=cnt;i++){

        if(num1==n-1){        

            f=true;

            break;

        }

        else{

            if(s[i].w<=x){

                int fx=find(s[i].x),fy=find(s[i].y);

                if(fx==fy) continue;

                else{

                    fa[fx]=fy;

                    if(s[i].cur==1) ++num;

                    ++num1;

                }

            }

        }

    }

    if(f&&num>=k) return true;

    return false;

}

int main(){

    scanf(“%d%d%d”,&n,&k,&m);

    for(int i=1;i<m;i++){

        int a,b,c,d;

        scanf(“%d%d%d%d”,&a,&b,&c,&d);

        s[++cnt].x=a; s[cnt].y=b; s[cnt].w=c; s[cnt].cur=1;

        s[++cnt].x=a; s[cnt].y=b; s[cnt].w=d; s[cnt].cur=2;

    }

    sort(s+1,s+1+cnt,cmp);

    int ans=0,l=0,r=30001;

    while(l<=r){

        int mid=l+(r-l)/2;

        if(check(mid)){

            ans=mid;

            r=mid-1;

        }

        else{

            l=mid+1;

        }

    }

    cout<<ans<<endl;

    return 0;

}

    原文作者:道路修建问题
    原文地址: https://blog.csdn.net/renxinyu2002/article/details/78341366
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞