线性规划裸题。。。

根据题目很容易可以得到线性规划方程(以样例为例):

Min(2*x1+5*x2+2*x3)

x1+ 0+ 0>=2

x1+x2+ 0>=3

0+x2+x3>=4

x1,x2,x3>=0

再将方程对偶,得到:

Max(2*x1+3*x2+4*x3)

x1+x2+ 0<=2

0+x2+x3<=5

0+ 0+x3<=2

x1,x2,x3>=0

这就是线性规划的标准型了。

为了方便单纯型算法,加入变量x4,x5,x6:

Max(2*x1+3*x2+4*x3)

x4+x1+x2+ 0=2

x5+ 0+x2+x3=5

x6+ 0+ 0+x3=2

x1,x2,x3,x4,x5,x6>=0

这就是松弛型。显然此时最优解不变。

将松弛型写成矩阵的形式:

x1 x2 x3

x4  1  1  0  2

x5  0  1  1  5

x6  0  1  1  2

2   3  4  0(k)

当x1,x2,x3取0时,显然满足条件,此时答案为右下角的常数k

我们只需不断增大k,当k达到最大值时最优解就是k了。

那么怎么增大k呢?显然如果我们增大x1,答案会更优。

但x1不能无限制地增大,对于前3个方程,我们得到x1的限制:

1、x1<=2

2、x1无限制

3、x1无限制

我们选择最紧的一个限制1,将x1增大到它,再交换x1,x4。

交换之后再将某些系数改变,使其满足方程就可以了。

于是我们可以不断交换,直到矩阵最后一行的系数都不为正就可以了。最优解就是k。

具体看代码。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define N 1001
#define M 10001
#define DB double
#define Eps 1e-7
#define INF 0x3f3f3f3f3f3f3f3f
DB a[M][N],c[N],b[M],Ans,Tmp;
int i,j,n,m,l,r,x;
inline void Pivot(int x,int y){ //转轴操作,使矩阵满足方程
b[x]/=a[x][y];
for(int i=;i<=n;i++)if(i!=y)a[x][i]/=a[x][y];
a[x][y]=/a[x][y];
for(int i=;i<=m;i++)
if(i!=x&&fabs(a[i][y])>Eps){
b[i]-=a[i][y]*b[x];
for(int j=;j<=n;j++)if(j!=y)a[i][j]-=a[i][y]*a[x][j];
a[i][y]*=-a[x][y];
}
Ans+=c[y]*b[x];
for(int i=;i<=n;i++)if(i!=y)c[i]-=c[y]*a[x][i];
c[y]*=-a[x][y];
}
inline DB Simplex(){
while(){ //不断交换
for(i=;i<=n;i++)if(c[i]>Eps)break;
if(i>n)return Ans;
Tmp=INF;
for(j=;j<=m;j++)
if(a[j][i]>Eps&&b[j]/a[j][i]<Tmp)Tmp=b[j]/a[j][i],x=j;
if(Tmp==INF)return INF;
Pivot(x,i); //交换第x行,第i列
}
}
int main()
{
scanf("%d%d",&n,&m);
for(i=;i<=n;i++)scanf("%lf",&c[i]);
for(i=;i<=m;i++){
scanf("%d%d%lf",&l,&r,&b[i]);
for(j=l;j<=r;j++)a[i][j]=;
}
printf("%d",(int)(Simplex()+0.5));
}

bzoj1061

bzoj1061--线性规划的更多相关文章

  1. 网络流解线性规划问题 BZOJ1061: [Noi2008]志愿者招募

    线性规划定义: 在给定有限的资源和竞争约束情况下,很多问题都可以表述为最大化或最小化某个目标.如果可以把目标指定为某些变量的线性函数,而且如果可以将资源约束指定为这些变量的等式或不等式,则得到了一个线 ...

  2. 单纯形求解线性规划(BZOJ1061)

    推荐一篇论文:http://wenku.baidu.com/view/ce5784754a7302768f99391d 我们设xi为第i个志愿者的招募次数,以样例为例,则不难列出如下的线性规划方程: ...

  3. BZOJ1061 NOI2008 志愿者招募 线性规划、费用流

    传送门 一道思路很妙的线性规划网络流 设\(X_i\)表示第\(i\)天需要的人数,\(P_i\)表示第\(i\)种人雇佣的个数 那么我们可以列出一系列式子 比如说样例就可以列出三个式子: \(P_1 ...

  4. 线性规划费用流解法(Bzoj1061: [Noi2008]志愿者招募)

    题面 传送门 Sol 线性规划费用流解法用与求解未知数为非负数的问题 这道题可以列出一堆形如 \(x[i]+x[j]+x[k]+...>=a[p]\) 的不等式 我们强行给每个式子减去一个东西, ...

  5. 【bzoj1061】[NOI2008]志愿者招募 线性规划与费用流

    题目描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完成,其中第i ...

  6. BZOJ1061: [Noi2008]志愿者招募(线性规划)

    Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 5725  Solved: 3437[Submit][Status][Discuss] Descript ...

  7. [BZOJ1061][Noi2008]志愿者招募 线性规划+费用流

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1061 根据题意列方程,然后用网络流解线性规划. 题解直接贴ByVoid的吧,太神了:htt ...

  8. BZOJ-1061 志愿者招募 线性规划转最小费用最大流+数学模型 建模

    本来一眼建模,以为傻逼题,然后发现自己傻逼...根本没想到神奇的数学模型..... 1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 ...

  9. 【bzoj1061】 Noi2008—志愿者招募

    http://www.lydsy.com/JudgeOnline/problem.php?id=1061 (题目链接) 题意 给定n天,第i天需要ai个志愿者,有m类志愿者,每类志愿者工作时间为[l, ...

  10. [BZOJ1061][Noi2008]志愿者招募

    [BZOJ1061][Noi2008]志愿者招募 试题描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿 ...

随机推荐

  1. 学习Redis从这里开始

    本文主要内容 Redis与其他软件的相同之处和不同之处 Redis的用法 使用Python示例代码与Redis进行简单的互动 使用Redis解决实际问题 Redis是一个远程内存数据库,它不仅性能强劲 ...

  2. RunLoop基础

    序言 RunLoop一直是比较高级而又比较神秘的技术,一直以来都没有深入去阅读过苹果给出的官方文档.本篇文章就讲讲苹果官方文档中所介绍的RunLoop,再加上其开源性,让我们一起深入去研究其特性及与线 ...

  3. ZOJ 3780 Paint the Grid Again

    拓扑排序.2014浙江省赛题. 先看行: 如果这行没有黑色,那么这个行操作肯定不操作. 如果这行全是黑色,那么看每一列,如果列上有白色,那么这一列连一条边到这一行,代表这一列画完才画那一行 如果不全是 ...

  4. STM32 USB 问题汇总(转)

    源:STM32 USB 问题汇总 汇总1:STM32的USB例程修改步骤,来自http://blog.csdn.net/cy757/archive/2010/01/01/5117610.aspx 以下 ...

  5. JS input file 转base64 JS图片预览

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. IOS开发中数据持久化的几种方法--NSUserDefaults

    IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...

  7. Hibernate中sessionfactory和session的多线程问题

    http://blog.sina.com.cn/s/blog_7ffb8dd5010146i3.html

  8. My97DatePicker显示时间控件的使用方法

    1.下载My97DatePicker到项目的WebContent文件夹,下载地址http://www.my97.net/dp/down.asp,项目文件夹目录如图所示 2.页面调用 在这里我的路径出现 ...

  9. 1)Linux学习笔记:crontab命令

    crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程 配置文件 ``` SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin: ...

  10. 2)Java学习笔记:匿名内部类

    为什么要使用匿名内部类 ①如果以前的类有一些缺陷,只是想在某一个模块进行修复,可以在引用该类的地方使用匿名内部类,在overRide方法进行修复. ②如果一个类,需要派生出很多类,而且这些类大多只是在 ...