博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cf 1141g Privatization of Roads in Treeland
阅读量:5357 次
发布时间:2019-06-15

本文共 1436 字,大约阅读时间需要 4 分钟。

题目大意: 给你一个不超过20万个点树,要求给每条边染色,要求最多不能有超过k个点他们的边染了相同的颜色。 求最少需要多少颜色和具体方案。

 

 

 

思路: 树上边的染色问题,其实很容易, 如果没有k的限制,所有点里面最大的度数就是我们的答案。  现在有k的限制,我们只要度排名在n-k的点的度是多少就我们的答案。 注意是度从小到大排序。 

 

然后我们dfs依次构造染色方案,非常的容易,只要当前的颜色和之前的颜色不一样就可以了,可以循环染色,即使用%

 

1 #include
2 using namespace std; 3 #define R register int 4 #define rep(i,a,b) for(R i=a;i<=b;i++) 5 #define Rep(i,a,b) for(R i=a;i>=b;i--) 6 #define gc() getchar() 7 #define ms(i,a) memset(a,i,sizeof(a)) 8 template
void read(T &x){ 9 x=0; char c=0; 10 while (!isdigit(c)) c=gc(); 11 while (isdigit(c)) x=x*10+(c^48),c=gc(); 12 }13 int const N=200000+3; 14 struct Edge{15 int to,nt,id; 16 }e[N<<1]; 17 int n,k,d[N],cnt,h[N],col[N]; 18 void add(int a,int b,int c){19 e[++cnt]=(Edge){b,h[a],c}; h[a]=cnt; 20 }21 void dfs(int x,int fa,int c){22 for(R i=h[x]; i; i=e[i].nt){23 int v=e[i].to; 24 if(v==fa) continue; 25 c=(c+1)%d[n-k]; 26 col[e[i].id]=c; 27 dfs(v,x,c); 28 }29 } 30 int main(){31 read(n); read(k); 32 rep(i,1,n-1){33 int x,y; read(x); read(y); 34 add(x,y,i); 35 add(y,x,i); 36 d[x]++;d[y]++; 37 }38 sort(d+1,d+n+1); 39 printf("%d\n",d[n-k]); 40 dfs(1,-1,-1); 41 rep(i,1,n-1) printf("%d ",col[i]+1); 42 return 0 ;43 }44 45 46
View Code

 

转载于:https://www.cnblogs.com/ZJXXCN/p/10616164.html

你可能感兴趣的文章
Java有没有goto?
查看>>
(转)makefile 的用法
查看>>
求不相邻金币相加和的最大值--动态规划1
查看>>
[转][osg]探索未知种族之osg类生物【目录】
查看>>
四十九. Zabbix报警机制 、 Zabbix进阶操作 、 监控案例
查看>>
元类中__new__ 与 __init__的区别--day27
查看>>
占小狼的简书博客
查看>>
struts2__action执行顺序
查看>>
php异常处理
查看>>
[xampp] /usr/bin/env: php: No such file or directory
查看>>
细学PHP 10 贴吧-2
查看>>
黑客攻防入门秘籍
查看>>
Swift迎来了1.0 GM 版(2014.09.09)
查看>>
【iOS开发-68】APP下载案例:利用tableView自带的cell布局+缓存池cell复用时注意button状态的检查...
查看>>
《Genesis-3D开源游戏引擎-FQA常见问题解答》2014年01月10号版本
查看>>
Java 编程下实现随机无重复数字功能
查看>>
Android 编程下的代码混淆
查看>>
animation属性
查看>>
页内的模块和组件抽象规划经验
查看>>
安全-分析深圳电信的新型HTTP劫持方式
查看>>