博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CodeForces-375E]Red and Black Tree
阅读量:5937 次
发布时间:2019-06-19

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

题目大意:

  给你一棵带边权的树,每个结点可能是红色或者黑色,你可以交换若干个点对使得任意一个红点到达与其最近的黑点的距离小于等于m。

思路:

  动态规划。
  f[i][j][k]表示以i为根的子树中,连向结点j,子树中已经确定有k个是黑点所需要的最小交换次数。
  best[i][k]表示以i为根的子树,已经确定有k个是黑点所需要的最小交换次数。
  设当前根为x,子结点为y,连向结点i,总共确定了k个黑点,新确定了l个黑点,转移方程为:
  f[x][i][k]=min(min{f[x][i][k-l]+best[y][l]},min{f[x][i][k-l+1]+f[y][i][l]-!col[i]});
  当然要判断新连向的点与当前根的距离,这可以事先跑一遍O(n^3)的Floyd。
  最后会被卡内存,据lyx介绍,由于n<=500,可以用uint16卡过去。

1 #include
2 #include
3 typedef unsigned short uint16; 4 inline int getint() { 5 register char ch; 6 while(!__builtin_isdigit(ch=getchar())); 7 register int x=ch^'0'; 8 while(__builtin_isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 9 return x;10 }11 template
12 inline _T1 min(const _T1 &a,const _T2 &b) {13 return a
16 inline _T1 max(const _T1 &a,const _T2 &b) {17 return a>b?a:b;18 }19 const uint16 inf=~0;20 const uint16 N=501;21 bool col[N];22 uint16 n,s;23 int m;24 int dis[N][N];25 std::vector
e[N];26 inline void add_edge(const uint16 &u,const uint16 &v,const int &w) {27 e[u].push_back(v);28 e[v].push_back(u);29 dis[u][v]=dis[v][u]=w;30 }31 uint16 f[N][N][N],best[N][N],size[N];32 void dfs(const uint16 &x,const uint16 &par) {33 for(uint16 i=0;i
m) continue;40 size[x]=1;41 f[x][i][1]=!col[i];42 for(register uint16 j=0;j

 

转载于:https://www.cnblogs.com/skylee03/p/7703565.html

你可能感兴趣的文章
【计算几何】【bitset】Gym - 101412G - Let There Be Light
查看>>
struts2-spring-plugin-2.0.14.jar中的SessionContextAutowiringInterceptor
查看>>
构造函数
查看>>
部署k8s集群监控Heapster
查看>>
webservice与WCF
查看>>
20款精美的精品电子商务设计~值得一看哦
查看>>
阿里云云服务器上安装Apache
查看>>
试用阿里云邮件推送服务
查看>>
Extra Credits: Easy Games 17
查看>>
Linux组件封装(八)——Socket的封装
查看>>
展开字符串
查看>>
关于选择器(很早之前写的)
查看>>
android 下linux的I2C 读写函数实例
查看>>
CLI组成
查看>>
maven - Eclipse构建maven项目
查看>>
关于VS2008/2010中SORT,stable_sort的比较函数中strict weak ordering
查看>>
局部内部类
查看>>
apache 开启网页压缩功能
查看>>
[Android四大组件之一]——Activity
查看>>
使用 ButterKnife 操作无效(不报错、点击后没效果)------代码编写错误
查看>>