线性规划裸题。。。

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

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. strace 分析 跟踪 进程错误

    strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和教学的Linux用户空间跟踪器.我们用它来监控用户空间进程和内核的交互,比如系统调用.信号传递.进程状态变更等. ...

  2. PHP foreach 遍历数组是打印出相同的数据

    https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make PHP makes it relatively easy ...

  3. Python+Selenuim测试网站,只能打开Firefox浏览器却不能打开网页的解决方法

    最开始我使用的Selenium版本为2.48,Firefox版本为37,自动化打开网站的时候,可以正常打开. 后来由于Firefox的自检测更新,版本更新为47,导致版本不兼容,自动化打开网站浏览器时 ...

  4. ubuntu 开启 ftp 服务 | mingming-killer

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  5. shell之crontab

    一  crontab高级用法 Crontab 主要是在做排程, 通常一般寫法大概都是如下: 0 0 * * * /usr/local/www/awstats/cgi-bin/awstats.sh 這種 ...

  6. coding菜鸟养成记

    http://www.cnblogs.com/xdp-gacl/category/563690.html http://www.cnblogs.com/vincent-blog/p/4402327.h ...

  7. bzoj1070 修车&& bzoj2879美食节 【费用流】

    bzoj1070: 把每个工人拆成汽车那么多个点,假如说 工人(i, j) 和 汽车k 连边,那就代表第i个工人倒数第j个修汽车k,那么这条边对以后的贡献就是k*time[i修k]. #include ...

  8. IOS开发-UI学习-UIPageControl(页码控制器)的使用

    UIPageControl即页码控制器,是在翻动图片阅览时下面显示的几个小点,属性设置如下: UIPageControl *pagecontrol = [[UIPageControl alloc]in ...

  9. sysctl.conf和limit.conf备忘待查

    #################################limits.conf设置################################### #修改最大进程和最大文件打开数限制v ...

  10. UVa 10360 - Rat Attack

    题目大意:有一个1025*1025的矩阵,每个矩阵元素保存这个点上老鼠的数量.现有一种气体炸弹,能覆盖“半径”为d的矩形,在这个范围内可以消灭所有的老鼠,让你找出合适的放置炸弹的位置使的消灭的老鼠数量 ...