学了下单纯形法解线性规划

看起来好像并不是特别难,第二个code有注释。我还有...*=-....这个不是特别懂

第一个是正常的,第二个是解对偶问题的

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps=1e-; int n,m; double sum;
double a[][],b[],c[];
void pivot(int o,int e)
{
b[o]/=a[o][e];
for(int i=;i<=n;i++)
if(i!=e)a[o][i]/=a[o][e];
a[o][e]=/a[o][e]; for(int i=;i<=m;i++)
if(i!=o&&fabs(a[i][e])>eps)
{
b[i]-=b[o]*a[i][e];
for(int j=;j<=n;j++)
if(j!=e)a[i][j]-=a[o][j]*a[i][e];
a[i][e]*=-a[o][e];
} sum+=c[e]*b[o];
for(int i=;i<=n;i++)
if(i!=e)c[i]-=a[o][i]*c[e];
c[e]*=-a[o][e];
}
void simplex()
{
int e,o; double d;
while()
{
d=;
for(int i=;i<=n;i++)
if(c[i]>d)d=c[i],e=i;
if(d==)return ; d=(<<);
for(int i=;i<=m;i++)
if(a[i][e]>eps&&d>b[i]/a[i][e])
d=b[i]/a[i][e],o=i;
if(d==(<<)){sum=(<<);return ;} pivot(o,e);
}
}
int main()
{
int K;
scanf("%d%d",&n,&K);m=*n+;n*=;
for(int i=;i<=n;i++)scanf("%lf",&c[i]);
for(int i=;i<=m;i++)
{
b[i]=K;
for(int j=;j<=n/;j++)a[i][i+j-]++;
}
for(int i=;i<=n;i++)
b[m+i]=,a[m+i][i]++;
m+=n;
sum=;simplex();
printf("%.0lf\n",sum);
return ;
}
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps=1e-; int n,m; double sum;
double a[][],b[],c[];
//解的过程中,由于基变量xi=ci,所以c也代表放在当前约束的基变量取值 void pivot(int o,int e)//把作为第o个约束的基变量用e替换
{
c[o]/=a[o][e];//没有替换之前,e的取值被当前限制,是c[o]/a[i][e],先令x=c
for(int i=;i<=m;i++)//把e的系数消掉,其实常数项c也是同理的
if(i!=e)a[o][i]/=a[o][e];
a[o][e]=/a[o][e];//难点!取倒数相当于保留了自己的常数项,而除以了上一个的常数项,这样下面就可以直接消除上一个的影响了 for(int i=;i<=n;i++)
if(i!=o&&fabs(a[i][e])>eps)//对于其它的约束条件,把离基的变量用进基的变量替代
{
c[i]-=c[o]*a[i][e];
for(int j=;j<=m;j++)
if(j!=e)a[i][j]-=a[o][j]*a[i][e];
a[i][e]*=-a[o][e];
} sum+=b[e]*c[o];//系数乘以值
for(int i=;i<=m;i++)//对于第i个变量当前已经用了b[e]*a[o][i]来贡献答案了
if(i!=e)b[i]-=a[o][i]*b[e];
b[e]*=-a[o][e];
}
void simplex()
{
int e,o; double d;
while()
{
d=;//找进基的变量
for(int i=;i<=m;i++)//基变量的b一定<=0,在非基变量中找一个对答案贡献最大(系数最大)的进基
if(b[i]>d)d=b[i],e=i;
if(d==)return ; d=(<<);//找离基的变量,进基变量系数的非负比要最小
for(int i=;i<=n;i++)//找对e的最小约束(即用此新角点截距最小,也就是当前e的取值被这个约束条件约束)离基
if(a[i][e]>eps&&d>c[i]/a[i][e])
d=c[i]/a[i][e],o=i;
if(d==(<<)){sum=(<<);return ;} pivot(o,e);
}
} int main()
{
int l,r;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%lf",&c[i]);
memset(a,,sizeof(a));
for(int i=;i<=m;i++)
{
scanf("%d%d%lf",&l,&r,&b[i]);
for(int j=l;j<=r;j++)a[j][i]++;
}
simplex();
printf("%.0lf\n",sum); return ;
}

---恢复内容结束---

bzoj3550: [ONTAK2010]Vacation&&bzoj3112: [Zjoi2013]防守战线的更多相关文章

  1. BZOJ3112 [Zjoi2013]防守战线 【单纯形】

    题目链接 BZOJ3112 题解 同志愿者招募 费用流神题 单纯形裸题 \(BZOJ\)可过 洛谷被卡.. #include<algorithm> #include<iostream ...

  2. bzoj3112 [Zjoi2013]防守战线

    正解:线性规划. 直接套单纯形的板子,因为所约束条件都是>=号,且目标函数为最小值,所以考虑对偶转换,转置一下原矩阵就好了. //It is made by wfj_2048~ #include ...

  3. 单纯形 BZOJ3112: [Zjoi2013]防守战线

    题面自己上网查. 学了一下单纯形.当然 证明什么的 显然是没去学.不然估计就要残废了 上学期已经了解了 什么叫标准型. 听起来高大上 其实没什么 就是加入好多松弛变量+各种*(-1),使得最后成为一般 ...

  4. 【BZOJ3112】[Zjoi2013]防守战线 单纯形法

    [BZOJ3112][Zjoi2013]防守战线 题解:依旧是转化成对偶问题,然后敲板子就行了~ 建完表后发现跟志愿者招募的表正好是相反的,感觉很神奇~ #include <cstdio> ...

  5. BZOJ3550: [ONTAK2010]Vacation

    3550: [ONTAK2010]Vacation Time Limit: 10 Sec  Memory Limit: 96 MBSubmit: 91  Solved: 71[Submit][Stat ...

  6. BZOJ 3112: [Zjoi2013]防守战线 [单纯形法]

    题目描述 战线可以看作一个长度为n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第i 号位置上建一座塔有Ci 的花费,且一个位置可以建任意多的塔,费用累加计算.有m 个区间[L1, R1], [ ...

  7. ZJOI2013 防守战线

    题目 战线可以看作一个长度为\(n\)的序列,现在需要在这个序列上建塔来防守敌兵,在序列第\(i\)号位置上建一座塔有\(C_i\)的花费,且一个位置可以建任意多的塔,费用累加计算.有\(m\)个区间 ...

  8. BZOJ3550 [ONTAK2010]Vacation 【单纯形】

    题目链接 BZOJ3550 题解 单纯形裸题 题意不清,每个位置最多选一次 #include<algorithm> #include<iostream> #include< ...

  9. 数学(线性规划): ZJOI2013 防守战线

    偷懒用的线性规划. #include <iostream> #include <cstring> #include <cstdio> using namespace ...

随机推荐

  1. hdu 1792 A New Change Problem(互质数之间最大不能组合数和不能组合数的个数)

    题意:求互质的m和n的最大不能组合数和不能组合数的个数 思路:m和n的最大不能组合数为m*n-m-n,不能组合数的个数为(m-1)*(n-1)/2 推导: 先讨论最大不能组合数 因为gcd(m,n)= ...

  2. GNU编译器学习 --> 如何链接外部库【Linking with external libraries】

    库也就是我们常说的library,一个库是若干个已经编译过的目标文件(.obj)的集合,它可以被链接到程序里.那么我们最常见的使用就是,我们在编程时会调用一些函数,这些函数别人已经写好了,它就放在库里 ...

  3. <Redis> 入门六 主从复制方式的集群

    1.集群如何操作 现在有三台虚拟机,ip分别为100,105,106,将100作为master,其他两台作为slave 1.vim redis.conf 以前的版本是 slaveof <mast ...

  4. shell脚本、if语句、for循环语句

    shell在shell脚本中,如果用户不输入东西,系统不自动退出,this is a bug!文件测试语句:-d -f -r -w -x -e逻辑测试语句:“&&”与(同时满足) “| ...

  5. Django之CBV和FBV

    Django之CBV和FBV CBV和FBV是C和F的区别: C是Class,F是Function 在请求中,有GET请求和POST请求. 在写CBV时,url是可以对应一个类的,在类中,分别写出GE ...

  6. jz2440开发板烧写裸板

    前提:手头没有openjtag,电脑上没有并口, 实现方法:jlink下载,nor上的uboot下载 关键点是用jlink下载uboot 1,使用jlink进行烧写,其中注意的是jlink只能烧写no ...

  7. Qt笔记——连接第三方库&用libZPlay库获取音频文件的艺术家、专辑等信息

    连接第三方库libZPlay 概述 需要.a/.lib ,.h , .dll 三个文件 官网下载 http://libzplay.sourceforge.net/ import .h 链接 .a 放入 ...

  8. 九度oj 题目1060:完数VS盈数

    题目1060:完数VS盈数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6461 解决:2426 题目描述: 一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1.则称其 ...

  9. httpClient使用总结

    前记 最近有个需求,需要根据商品id获取商品详情: 首先想到的是在浏览器里输入url按回车就可以了:或者在linux中使用curl+url来发起一个http请求; 但如果是要在java程序中发出htt ...

  10. 用ReentrantLock和Condition实现生产者和消费者模式

    前面一篇文章<wait.notify应用场景(生产者-消费者模式)>是一种生产者消费者模式实现,今晚这是Lock方式实现,下面是源码: 生产者代码: /** * 生产者 * * @auth ...