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

#include
#include
#include
#include
#include
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     return a.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         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<     return 0;
}

你可能感兴趣的:(二分专题)