• 繁忙的都市


    城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造。

    城市C的道路是这样分布的:

    城市中有 n 个交叉路口,编号是 1∼n,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路相连接。

    这些道路是 双向 的,且把所有的交叉路口直接或间接的连接起来了。

    每条道路都有一个分值,分值越小表示这个道路越繁忙,越需要进行改造。

    但是市政府的资金有限,市长希望进行改造的道路越少越好,于是他提出下面的要求:

    1.改造的那些道路能够把所有的交叉路口直接或间接的连通起来。

    2.在满足要求1的情况下,改造的道路尽量少。

    3.在满足要求1、2的情况下,改造的那些道路中分值最大值尽量小。

    作为市规划局的你,应当作出最佳的决策,选择那些道路应当被修建。

    输入格式

    第一行有两个整数 n,m 表示城市有 n 个交叉路口,m 条道路。

    接下来 mm 行是对每条道路的描述,每行包含三个整数u,v,c 表示交叉路口 u 和 v 之间有道路相连,分值为 c。

    输出格式

    两个整数 s,max表示你选出了几条道路,分值最大的那条道路的分值是多少。

    数据范围

    1≤n≤300
    1≤m≤8000
    1≤c≤10000

    输入样例:

    4 5
    1 2 3
    1 4 5
    2 4 7
    2 3 6
    3 4 8
    

    输出样例:

    3 6
    

    思考

    每次二分枚举最大的分值,然后把大于的分值的边删除掉,看剩下的边是否可以作为一棵树把图连通。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N=310,M=8010;
    int fa[N];
    struct eg{
        int u,v,c;
        bool operator<(const eg&b)const {
            return c<b.c;
        }
    }e[M];
    int n,m;
    int Find(int x){
        return fa[x]==x?x:fa[x]=Find(fa[x]);
    }
    bool check(int Max){
        for(int i=1;i<=n;++i) fa[i]=i;
        for(int i=1;i<=m;++i){
            int u=e[i].u,v=e[i].v,c=e[i].c;
            if(c>Max) continue;
            int fu=Find(u),fv=Find(v);
            if(fu!=fv){
                fa[fu]=fv;
            }
        }
        for(int i=2;i<=n;++i){
            if(Find(i)!=Find(i-1)) return false;
        }
        return true;
    }
    int main(){
        
        cin>>n>>m;
        for(int i=1;i<=m;++i){
            cin>>e[i].u>>e[i].v>>e[i].c;
        }
        int l=1,r=10000,ans=r;
        while(l<=r){
            int mid=(l+r)/2;
            if(check(mid)){
                r=mid-1;
                ans=mid;
            }
            else l=mid+1;
        }
        cout<<n-1<<" "<<ans;
        return 0;
    }
    
  • 相关阅读:
    BZOJ2821 作诗(Poetize) 【分块】
    BZOJ2724 蒲公英 【分块】
    Codeforces 17E Palisection 【Manacher】
    BZOJ2565 最长双回文串 【Manacher】
    Codeforces 25E Test 【Hash】
    CODEVS3013 单词背诵 【Hash】【MAP】
    HDU2825 Wireless Password 【AC自动机】【状压DP】
    HDU2896 病毒侵袭 【AC自动机】
    HDU3065 病毒侵袭持续中【AC自动机】
    HDU2222 Keywords Search 【AC自动机】
  • 原文地址:https://www.cnblogs.com/jjl0229/p/12883996.html
Copyright © 2020-2023  润新知