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)<<" ";
}