zoukankan      html  css  js  c++  java
  • bzoj 1196: [HNOI2006]公路修建问题(二分+贪心)

    传送门

    解题思路

      看到最大,肯定要先想二分答案。二分之后首先从小到大枚举(k)个小于(lim)的所有一级公路,然后用并查集连到一起,然后就在剩下的里面从小到大找n-1-k个二级公路,模仿最小生成树的形成过程还是用并查集维护。为什么这样是对的呢?我的想法是因为已经有了一个二分出来的限制,而且最后要使整张图联通,那么其实对于一个符合要求的环来说删去任意一条边都行,那么我们相当于在这个环上选上这个第一级公路,然后删掉一个二级公路,对于答案没有影响。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
     
    using namespace std;
    const int MAXN = 10005;
     
    inline int rd(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
        while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
     
    int n,fa[MAXN],m,k;
    int ans;
     
    struct Data{
        int x,y,c1,c2;
    }data[MAXN<<1],tmp[MAXN<<1];
     
    int get(int x){
        if(x==fa[x]) return x;
        return fa[x]=get(fa[x]);
    }
     
    inline bool cmp(Data A,Data B){
        return A.c1<B.c1;
    }
     
    inline bool cmp_(Data A,Data B){
        return A.c2<B.c2;
    }
     
    inline bool check(int lim){
        for(int i=1;i<=n;++i) fa[i]=i;
        int num=0;
        for(int i=1;i<=m;++i){
            if(tmp[i].c2>lim) return false;
            int u=get(tmp[i].x),v=get(tmp[i].y);
            if(u!=v) num++,fa[u]=v;
            if(num==k) break;
        }
        for(int i=1;i<=m;++i){
            if(data[i].c1>lim) return false;
            int u=get(data[i].x),v=get(data[i].y);
            if(u!=v) num++,fa[u]=v;
            if(num==n-1) break;
        }
        return true;
    }
     
    int main(){
        n=rd();k=rd();m=rd();m--;
        for(register int i=1;i<=m;i++){
            data[i].x=rd();data[i].y=rd();
            data[i].c2=rd();data[i].c1=rd();
            tmp[i]=data[i];
        }
        sort(data+1,data+1+m,cmp);sort(tmp+1,tmp+1+m,cmp_);
        int l=1,r=30001,mid;
        while(l<=r){
            mid=(l+r)>>1;
            if(check(mid)) ans=mid,r=mid-1;
            else l=mid+1;
        }cout<<ans;
        return 0;
    }
    
  • 相关阅读:
    jmeter(八)断言
    jmeter(七)定时器
    jmeter(六)元件的作用域与执行顺序
    JS 正则详解
    表单验证
    ubuntu16.04安装Grafana
    Crontab详细用法-定时任务详解
    ubuntu16.04 安装influxdb,简单使用
    jQuery CSS操作 点赞样式
    jQuery文档处理
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9818959.html
Copyright © 2011-2022 走看看