zoukankan      html  css  js  c++  java
  • [CF1141G] Privatization of Roads in Treeland

    Description

    (n) 个城市和 (n-1) 条道路。政府决定向这些公司出售道路。每条路都属于一家公司。如果有一家公司拥有两条或两条以上的进入这个城市的道路,那么这个城市是不好的。希望这样不公平的城市数量不超过 (k),那么最少需要多少公司?

    Solution

    答案显然为度数从大到小排序后的第 (k+1) 个,构造方案时贪心即可

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 1000005;
    
    int d[N],dd[N],v[N],f[N],t1,t2,n,k;
    
    map<pair<int,int>,int> mp;
    vector <int> g[N];
    
    void dfs(int p,int ff) { //cout<<p<<","<<ff<<endl;
        v[p]=1;
        int c=1;
        for(int q:g[p]) if(!f[mp[make_pair(p,q)]]) {
            if(c==ff) ++c;
            f[mp[make_pair(p,q)]]=c;
            if(!v[q]) dfs(q,c);
            c++;
        }
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n>>k;
        for(int i=1;i<n;i++) {
            cin>>t1>>t2;
            g[t1].push_back(t2);
            g[t2].push_back(t1);
            mp[make_pair(t1,t2)]=i;
            mp[make_pair(t2,t1)]=i;
            d[t1]++;
            d[t2]++;
            dd[t1]++;
            dd[t2]++;
        }
        sort(dd+1,dd+n+1);
        int mx=dd[n-k];
        for(int i=1;i<=n;i++) if(d[i]>mx && k) v[i]=1, --k;
        for(int i=1;i<=n;i++) if(d[i]==mx && k) v[i]=1, --k;
        //for(int i=1;i<=n;i++) cout<<v[i]<<" ";
        //cout<<endl;
        for(int i=1;i<=n;i++) if(!v[i]) dfs(i,0);
        cout<<mx<<endl;
        for(int i=1;i<n;i++) cout<<max(f[i],1ll)<<" ";
    }
    
  • 相关阅读:
    Storybook 最新教程
    Monorepo All In One
    zsh & git alias
    vue-cli emit webpack config
    iflab隔壁ios组新生面试题
    [转]sprintf
    python版归并排序
    关于linux下GCC生成共享库(动态链接库)的探究
    ubuntu不小心删除了libc-bin的恢复办法
    python实现栈
  • 原文地址:https://www.cnblogs.com/mollnn/p/12914960.html
Copyright © 2011-2022 走看看