zoukankan      html  css  js  c++  java
  • 线性规划对偶

    如果题目要求解一个线性规划问题,可能可以使用这个知识点。

    以下面一个方程为例:

    5x[1]+2x[2]+3x[3]<=60

    10x[1]+5x[2]+4x[3]<=100

    x[1]+6x[2]+7x[3]<=50

    求x[1]+5x[2]+3x[3]的最大值

    x[i]>=0

    转化得到:

    5x[1]+10x[2]+x[3]>=1

    2x[1]+5x[2]+6x[3]>=5

    3x[1]+4x[2]+7x[3]>=3

    求60x[1]+100x[2]+50x[3]的最小值。

    例题:

    CF671D

    此题可以使用线段树+dfs序或线段树合并解决,但是有更奇妙的方法。

    题目要求使用m条从儿子->父亲的链覆盖整棵树,且边权和最小。

    实际上可以设计个线性规划模型。

    设有一颗树,1-2有边,1-3有边,3-4有边。

    有3条链:1-2,1-4,3-4,权值为1,3,2

    把每条链作为一个变量,每一条边作为一个方程。变量为x[1],x[2],x[3]。

    可以设计出这个线性规划模型:

    x[1]>=1

    x[2]>=1

    x[2]+x[3]>=1

    x[i]>=0

    最小化x[1]+3x[2]+2x[3]

    补全方程:

    x[1]+0x[2]+0x[3]>=1

    0x[1]+x[2]+0x[3]>=1

    0x[1]+x[2]+x[3]>=1

    x[i]>=0

    最小化x[1]+3x[2]+2x[3]

    对偶一下:

    x[1]<=1

    x[2]+x[3]<=3

    x[3]<=2

    最大化x[1]+x[2]+x[3]

    它的意义是:把每条链作为一个方程,把每条边作为一个变量,要求给每条边赋一个权值,使得每条链上的权值和<=它的代价,且让权值和最大。

    从深到浅能选就选。用可并堆维护当前x->父亲能选多少个。选了以后就打一个标记表示堆内元素整体减去一个值。

    当堆顶不在范围内就删除。

    bzoj3118

  • 相关阅读:
    程序员开发工作之算法和架构
    iOS开发学习概述及知识整理
    git基本技巧及进阶
    使用命令行工具运行Xcode 7 UI Tests
    技巧集锦2
    Xcode开发小问题集锦
    Xcode 7如何 免费 真机调试iOS应用
    常用shell script 珍藏
    多线程学习7--CountDownLatch
    学习多线程6---栅栏
  • 原文地址:https://www.cnblogs.com/cszmc2004/p/13079859.html
Copyright © 2011-2022 走看看