zoukankan      html  css  js  c++  java
  • bzoj1196: [HNOI2006]公路修建问题

    贪心+并查集就可以了。

    #include<cstdio>
    #include<cstring>
    #include<cctype>
    #include<algorithm>
    using namespace std;
    #define rep(i,s,t) for(int i=s;i<=t;i++)
    #define clr(x,c) memset(x,c,sizeof(x))
    int read(){
        int x=0;char c=getchar();
        while(!isdigit(c)) c=getchar();
        while(isdigit(c)) x=x*10+c-'0',c=getchar();
        return x;
    }
    const int nmax=1e4+5;
    const int inf=0x7f7f7f7f;
    struct edge{
        int u,v,d,dis;
    };
    edge es[nmax<<1];
    int fa[nmax],n,m,K;
    int find(int x){
        return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    bool check(int x){
        rep(i,1,n) fa[i]=i;
        int cnt=0,tot=0,ta,tb;
        rep(i,1,m){
            if(es[i].d>x) continue;
            ta=find(es[i].u),tb=find(es[i].v);
            if(ta!=tb) fa[ta]=tb,cnt++,tot++;
        }
        if(cnt<K) return 0;
        rep(i,1,m){
            if(es[i].dis>x) continue;
            ta=find(es[i].u),tb=find(es[i].v);
            if(ta!=tb) fa[ta]=tb,tot++;
        }
        return tot==n-1;
    }
    int main(){
        n=read(),K=read(),m=read();
        rep(i,1,m-1) es[i].u=read(),es[i].v=read(),es[i].d=read(),es[i].dis=read();
        int l=1,r=30000,ans,mid;
        while(l<=r){
            mid=(l+r)>>1;
            if(check(mid)) ans=mid,r=mid-1;
            else l=mid+1;
        }
        printf("%d
    ",ans);
        return 0;
    }
    

      

    1196: [HNOI2006]公路修建问题

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 1825  Solved: 1042
    [Submit][Status][Discuss]

    Description

    OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多。然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕。所以,OIER Association组织成立了,旨在建立OI island的交通系统。 OI island有n个旅游景点,不妨将它们从1到n标号。现在,OIER Association需要修公路将这些景点连接起来。一条公路连接两个景点。公路有,不妨称它们为一级公路和二级公路。一级公路上的车速快,但是修路的花费要大一些。 OIER Association打算修n-1条公路将这些景点连接起来(使得任意两个景点之间都会有一条路径)。为了保证公路系统的效率, OIER Association希望在这n-1条公路之中,至少有k条(0≤k≤n-1)一级公路。OIER Association也不希望为一条公路花费的钱。所以,他们希望在满足上述条件的情况下,花费最多的一条公路的花费尽可能的少。而你的任务就是,在给定一些可能修建的公路的情况下,选择n-1条公路,满足上面的条件。

    Input

    第一行有三个数n(1≤n≤10000),k(0≤k≤n-1),m(n-1≤m≤20000),这些数之间用空格分开。 N和k如前所述,m表示有m对景点之间可以修公路。以下的m-1行,每一行有4个正整数a,b,c1,c2 (1≤a,b≤n,a≠b,1≤c2≤c1≤30000)表示在景点a与b 之间可以修公路,如果修一级公路,则需要c1的花费,如果修二级公路,则需要c2的花费。

    Output

    一个数据,表示花费最大的公路的花费。

    Sample Input

    10 4 20
    3 9 6 3
    1 3 4 1
    5 3 10 2
    8 9 8 7
    6 8 8 3
    7 1 3 2
    4 9 9 5
    10 8 9 1
    2 6 9 1
    6 7 9 8
    2 6 2 1
    3 8 9 5
    3 2 9 6
    1 6 10 3
    5 6 3 1
    2 7 6 1
    7 8 6 2
    10 9 2 1
    7 1 10 2

    Sample Output

    5

    HINT

     

    Source

     
    [Submit][Status][Discuss]
  • 相关阅读:
    LeetCode对撞指针汇总
    167. Two Sum II
    215. Kth Largest Element in an Array
    2018Action Recognition from Skeleton Data via Analogical Generalization over Qualitative Representations
    题解 Educational Codeforces Round 84 (Rated for Div. 2) (CF1327)
    题解 JZPKIL
    题解 八省联考2018 / 九省联考2018
    题解 六省联考2017
    题解 Codeforces Round #621 (Div. 1 + Div. 2) (CF1307)
    题解Codeforces Round #620 (Div. 2)
  • 原文地址:https://www.cnblogs.com/fighting-to-the-end/p/5858111.html
Copyright © 2011-2022 走看看