• 【BZOJ3112】[ZJOI2013] 防守战线(单纯形法与线性规划)


    点此看题面

    大致题意: (egin{align}min &sum_{j=1}^nc_jx_j&\s.t. &sum_{j=l_i}^{r_i}x_jge b_i&i=1,2,...,m\&x_jge0&j=1,2,...,nend{align})

    对偶图

    首先,我们把它转化一下,令(a_{i,j}=[jin[l_i,r_i]]),得到:

    [egin{align}min &sum_{j=1}^nc_jx_j&\s.t. &sum_{j=1}^na_{i,j}x_jge b_i&i=1,2,...,m\&x_jge0&j=1,2,...,nend{align} ]

    然后我们发现,这东西和我们熟知的线性规划式子并不一样,它求的是最小值,且限制中式子的符号都是大于等于,刚好和线性规划相反。

    然而,有一种名叫线性规划对偶的东西,证明这个问题的最优解等同于下面这个问题的最优解:

    [egin{align}max &sum_{j=1}^nb_jx_j&\s.t. &sum_{j=1}^na_{j,i}x_jle c_i&i=1,2,...,m\&x_jge0&j=1,2,...,nend{align} ]

    而这就是经典的线性规划,直接套板子即可。

    除此之外,这里限制矩阵的系数只有(0,1),被称作全幺模矩阵(实际上全幺模矩阵的系数还可以有(-1)),而这种矩阵的答案必然为整数,符合题意。

    代码

    #include<bits/stdc++.h>
    #define Tp template<typename Ty>
    #define Ts template<typename Ty,typename... Ar>
    #define Reg register
    #define RI Reg int
    #define Con const
    #define CI Con int&
    #define I inline
    #define W while
    #define N 1000
    #define M 10000
    #define DB double
    #define eps 1e-8
    using namespace std;
    int n,m;DB a[N+5][M+5];
    namespace SimplexMethod//限制矩阵只有0,1,简化版的单纯形法
    {
    	I void Pivot(CI l,CI e)
    	{
    		RI i,j;DB t=a[l][e];for(a[l][e]=1,i=0;i<=n;++i) a[l][i]/=t;
    		for(i=0;i<=m;++i) if(i^l&&fabs(a[i][e])>eps)
    			for(t=a[i][e],a[i][e]=j=0;j<=n;++j) a[i][j]-=t*a[l][j];
    	}
    	I void Simplex()
    	{
    		RI i,l,e;DB Mn;W(1)
    		{
    			for(l=e=0,Mn=1e9,i=1;i<=n;++i) if(a[0][i]>eps) {e=i;break;}if(!e) return;
    			for(i=1;i<=m;++i) a[i][e]>eps&&a[i][0]/a[i][e]<Mn&&(Mn=a[i][0]/a[i][e],l=i);Pivot(l,e);
    		}
    	}
    	I void Solve() {Simplex(),printf("%d
    ",(int)(-a[0][0]+0.5));}//四舍五入得到整数
    };
    int main()
    {
    	RI i,j,x,y;for(scanf("%d%d",&m,&n),i=1;i<=m;++i) scanf("%lf",a[i]);//注意对偶
    	for(i=1;i<=n;++i) for(scanf("%d%d%lf",&x,&y,a[0]+i),j=x;j<=y;++j) a[j][i]=1;
    	return SimplexMethod::Solve(),0;//单纯形法
    }
    
  • 相关阅读:
    java map集合的知识
    [JAVA_开课吧资源]第三周 常用类库、异常处理
    [SmartTV_Samsung]Samsung Smart TV 开发环境搭建
    [JAVA_源代码]如何在Eclipse sdk中查看源代码rt.jar
    [PPT_书]《Presentation Zen》
    [JAVA_开课吧资源]第二周 面向对象程序设计
    [Java_kaikeba]java中堆和栈的区别(对象变量的理解)
    [JAVA_开课吧资源]第一周 Java语言概述、Java语言基础
    [u/COS-II_安装]在PC机上的移植
    [IOS_HTML5]各种JS框架介绍--用HTML5/CSS3/JS开发Android/IOS应用
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/BZOJ3112.html
Copyright © 2020-2023  润新知