[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)<<" ";
}
原文地址:https://www.cnblogs.com/mollnn/p/12914960.html