CF375E Red and Black Tree(线性规划)

Luogu

题解时间

很明显有一个略显复杂的 $ n^3 $ dp,但不在今天讨论范围内。

考虑一些更简单的方法。

设有 $ m $ 个点为黑,转化成线性规划问题,很明显有

\[minimum:\sum\limits_{i} ( 1 - col_{i} ) x_{i}
\]
\[\sum\limits_{ dis(i,j) \le lim } x_{j} \ge 1
\]
\[\sum\limits_{i} x_{i} =m
\]

最后的一个等式转化成两个不等式,之后将整个线性规划利用对偶原理转化成标准型直接单纯形法求解即可。

毫无疑问最终结果不会有 $ x_{i} > 1 $ ,而对于是否可能出现小数,很明显不会影响最终结果。

#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operator<(const pat &p)const{return x==p.x?y<p.y:x<p.x;}};
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
template<typename TP,typename... Args>inline void read(TP& t,Args&... args){read(t),read(args...);}
namespace RKK
{
const int N=511;
const double eps=1e-8,inf=1e18;int cz(const double &a){return fabs(a)<=eps?0:(a>eps?1:-1);}
struct sumireko{int to,ne,w;}e[N<<1];int he[N],ecnt;
void addline(int f,int t,int w){e[++ecnt].to=t,e[ecnt].w=w,e[ecnt].ne=he[f],he[f]=ecnt;}
namespace lisp
{
int n,m,id[N<<1];double a[N][N];
void pivot(int l,int e)
{
swap(id[m+l],id[e]);
double k=-a[l][e];a[l][e]=-1;
for(int j=0;j<=m;j++) a[l][j]/=k;
for(int i=0;i<=n;i++)if(i!=l&&cz(a[i][e]))
{
k=a[i][e],a[i][e]=0;
for(int j=0;j<=m;j++) a[i][j]+=k*a[l][j];
}
}
int init()
{
for(int i=1;i<=m+n;i++) id[i]=i;
while(1)
{
int l=0,e=0;
for(int i=1;i<=n;i++)if(cz(a[i][0])<0&&(!l||rand()&1)) l=i;
if(!l) break;
for(int j=1;j<=m;j++)if(cz(a[l][j])>0&&(!e||rand()&1)) e=j;
if(!e) return -1;//no solution
pivot(l,e);
}return 0;
}
int simplex()
{
while(1)
{
int l=0,e=0;double mi=inf;
for(int j=1;j<=m;j++)if(cz(a[0][j])>0&&(!e||rand()&1)) e=j;
if(!e) break;
for(int i=1;i<=n;i++)if(cz(a[i][e])<0&&(!l||-a[i][0]/a[i][e]<mi)) l=i,mi=-a[i][0]/a[i][e];
if(!l) return -1;//unbounded
pivot(l,e);
}return 0;
}
void work()
{
if(init()==-1) return (void)(puts("-1"));
if(simplex()==-1) return (void)(puts("-1"));
printf("%.0lf\n",a[0][0]);
}
}
int n,m,lim,col[N];
void dfs(int x,int f,int sp,int dis)
{
if(dis>lim) return;
lisp::a[x][sp]=-1;
for(int i=he[x],t=e[i].to;i;i=e[i].ne,t=e[i].to)if(t!=f) dfs(t,x,sp,dis+e[i].w);
}
int main()
{
read(n,lim);for(int i=1;i<=n;i++) read(col[i]),m+=col[i];
for(int i=2,x,y,w;i<=n;i++) read(x,y,w),addline(x,y,w),addline(y,x,w);
lisp::n=n,lisp::m=n+2;
for(int i=1;i<=n;i++) lisp::a[i][0]=!col[i],lisp::a[0][i]=1;lisp::a[0][n+1]=m,lisp::a[0][n+2]=-m;
for(int i=1;i<=n;i++) lisp::a[i][n+1]=-1,lisp::a[i][n+2]=1;
for(int i=1;i<=n;i++) dfs(i,0,i,0);
lisp::work();
return 0;
}
}
int main(){return RKK::main();}

CF375E Red and Black Tree(线性规划)的更多相关文章

  1. [CC-BLREDSET]Black and Red vertices of Tree

    [CC-BLREDSET]Black and Red vertices of Tree 题目大意: 有一棵\(n(\sum n\le10^6)\)个结点的树,每个结点有一种颜色(红色.黑色.白色).删 ...

  2. BNUOJ 26229 Red/Blue Spanning Tree

    Red/Blue Spanning Tree Time Limit: 2000ms Memory Limit: 131072KB This problem will be judged on HDU. ...

  3. 「CF375E」Red and Black Tree「树形DP」

    题意 给定一个结点颜色红或黑的树,问最少进行多少次交换黑.红结点使得每个红结点离最近的黑结点距离\(\leq x\). \(1\leq n \leq 500, 1 \leq x \leq 10^9\) ...

  4. [Codeforces375E]Red and Black Tree

    Problem 给定一棵有边权的树.树上每个点是黑或白的.黑白点能两两交换. 求符合任意一个白点到最近黑点的距离小于等于x时,黑白点交换次数最少为多少. Solution 明显是一题树形DP.我们先跑 ...

  5. [CodeForces-375E]Red and Black Tree

    题目大意: 给你一棵带边权的树,每个结点可能是红色或者黑色,你可以交换若干个点对使得任意一个红点到达与其最近的黑点的距离小于等于m. 思路: 动态规划. f[i][j][k]表示以i为根的子树中,连向 ...

  6. 设计模式 --深入理解javascript

    /* 一.单例模式 */ var Universe; (function () { var instance; Universe = function Universe() { if (instanc ...

  7. 【转】并查集&MST题集

    转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...

  8. RH133读书笔记(11)-Lab 11 System Rescue and Troubleshooting

    Lab 11 System Rescue and Troubleshooting Goal: To build skills in system rescue procedures. Estimate ...

  9. 解读Linux命令格式(转)

    解读Linux命令格式   环境 Linux HA5-139JK 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x8 ...

随机推荐

  1. JavaScript 的DOM操作详解

    内容概要 DOM之查找标签 基本查找 间接查找 节点操作 获取值操作 class操作 样式操作 事件 内置参数this 事件练习 内容详细 DOM操作 DOM(Document Object Mode ...

  2. 「codeforces - 1284G」Seollal

    给定 \(n\times m\) 的网格图,有些格子有障碍,无障碍且相邻的格子之间连边形成图.保证 \((1, 1)\) 无障碍,保证无障碍格子连通. 将网格图黑白染色,相邻格子颜色不同,\((1, ...

  3. 『无为则无心』Python面向对象 — 47、Python中的self详解

    目录 1.self的作用 2.self的使用注意事项 (1)self代表类的实例,而非类 (2)self不必非写成self,只是一种规范. (3)类中方法的形参中一定要写self,包括内置函数 (4) ...

  4. RENIX报文字段跳变——网络测试仪实操

    什么是报文字段跳变? 报文字段跳变是指字段的值进行一些列有规则的变化,Renix支持对字段进行递增.递减.列表和随机变化. 如当用户想要仿真大量的源IP变化的数据时,就可以使用Modifier进行规则 ...

  5. RFC3918组转发矩阵测试——网络测试仪实操

    一.简介 1.RFC3918简介 历史 · 在1999年3月成为正式标准 功能 · 评测网络互连设备或网络系统的性能 · 网络设备: 交换机,路由器- 内容 · 定义了一整套测试方法,为不同厂家的设备 ...

  6. 动态语言运行时(DLR)

    前言 为了让C#.Visual Basic等.NET编程语言能具备动态编程语言的特性,.NET 4.0引入了一个"DLR(Dynamic Language Runtime:动态语言运行时)& ...

  7. vs2019 NuGet安装及简单使用

    Nuget介绍 官网定义:NuGet是.NET的软件包管理器(免费).NuGet客户端工具提供了生成和使用软件包的能力.NuGet Gallery 是所有软件包作者和消费者都使用的中央软件包存储库. ...

  8. PostgreSQL-PL/pgSQL控制结构

    PL/pgSQL的控制结构是最重要及最有用的一部分了,在实际工作场景都离不开业务处理逻辑,在写PL/pgSQL时,利用控制结构来操作数据.PL/pgSQL支持的控制结构与其他语言几乎差不多,比如:条件 ...

  9. Android系统编程入门系列之硬件交互——无线通信WLAN

    Android系统的移动设备大多支持无线WLAN技术.利用该技术,不仅能实现互联网通信,还能实现无线定位,热点共享等远程通信功能.针对使用WLAN的不同功能,可能需要分别申请不同的权限声明,同时调用不 ...

  10. matplotlib(终章)

    今日内容概要 matplotlib实际案例演示 各种图形的总结 数据清洗(简单) 数据清洗的案例 今日内容详细 matplotlib实际案例演示 # 2.绘制每年电影上映数量曲线图 首先载入模块 im ...