正题

题目链接:https://www.luogu.com.cn/problem/P3337


题目大意

\(n\)个地方可以建立塔也可以不建立塔,第\(i\)个位置建立需要消耗\(C_i\)元

\(m\)个限制要求在某个区间内的塔的数量超过\(D_i\)

\(1\leq n\leq 1000,1\leq m\leq 10000\)


题目大意

抽象成数学模型的话

\[minimize\ \ \sum_{i=1}^nC_ix_i
\]
\[\sum_{l_i}^{r_i}x_{i,j}\geq D_i
\]

然后网络流好像草不过去,考虑点线性规划玄学算法

先把它对偶了

\[maximize\ \ \sum_{i=1}^nD_ix_i
\]
\[\sum_{l_i}^{r_i}x_{i,j}\leq C_i
\]

然后就是一个裸的单纯形了。

所以单纯形是什么,这里就粗略的讲一下。

我是看线性规划与单纯形算法-吴一凡的课件学的

对于普通的松弛型有三个限制:

  1. 对于每个\(i\)满足\(\sum_{j=1}^nA_{i,j}x_j+x_{n+i}=b_i\)
  2. \(x_{n+i}\geq 0\)
  3. 最大化\(\sum_{i=1}^nx_ic_i\)

定义所有的\(x_{n+i}\)为基变量,\(x_i(i\leq n)\)为非基变量

然后单纯形的流程就是先找出任意一个\(c_i\)为正的基变量\(x_p\)

然后去掉所有其他非基变量后得到一个对于\(x_p\)最小的限制,即最小的\(\frac{c_p}{a_{p,z}}\)

然后考虑交换非基变量\(x_p\)和基变量\(x_{z+n}\),此时可以得到一个由第\(z\)行的式子推出的关于\(x_p\)的式子,带入回到需要最大化的式子当中。此时由于\(c_i\)为正,所以式子中会有一个正的常数。

此时这个常数就相当于大化了那个式子,不停重复上面的转轴操作直到无法找到正的\(c_i\)为止(此时就代表无法继续扩大了)

这个是实数的,但是我们这题的要求是整数,但是我们这里的约束矩阵\(A\)是一个全幺模矩阵,所以至少保证有一组最优解全是整数,又不用输出方案,直接单纯形暴艹就可以了

复杂度比较玄学,但是能过这题


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1100;
const double eps=1e-8,inf=1e9;
int n,m;double c[N],w[N*10],a[N][N*10],ans;
void Pivot(int l,int e){
c[l]/=a[l][e];
for(int i=1;i<=m;i++)
if(i!=e)a[l][i]/=a[l][e];
a[l][e]=1.0;
for(int i=1;i<=n;i++)
if(i!=l&&fabs(a[i][e])>eps){
c[i]-=a[i][e]*c[l];
for(int j=1;j<=m;j++)
if(j!=e)a[i][j]-=a[i][e]*a[l][j];
a[i][e]=-a[i][e]*a[l][e];
} ans+=w[e]*c[l];
for(int i=1;i<=m;i++)
if(i!=e)w[i]-=w[e]*a[l][i];
w[e]=-w[e]*a[l][e];
}
double simplex(){
while(1){
double mins=inf;
int i=0,j=0,k=0;
for(j=1;j<=m;j++)
if(w[j]>eps)break;
if(j>m)return ans;
for(i=1;i<=n;i++)
if(a[i][j]>eps&&mins>c[i]/a[i][j])
k=i,mins=c[i]/a[i][j];
if(mins>=inf)return inf;
Pivot(k,j);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%lf",&c[i]);
for(int i=1;i<=m;i++){
int l,r;
scanf("%d%d%lf",&l,&r,&w[i]);
for(int j=l;j<=r;j++)a[j][i]=1.0;
}
printf("%d\n",(int)(simplex()+0.5));
return 0;
}

P3337-[ZJOI2013]防守战线【单纯形】的更多相关文章

  1. BZOJ 3112 Zjoi2013 防守战线 单纯形

    题目大意: 单纯形*2.. . #include <cmath> #include <cstdio> #include <cstring> #include < ...

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

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

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

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

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

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

  5. ZJOI2013 防守战线

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

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

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

  7. bzoj3112 [Zjoi2013]防守战线

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

  8. BZOJ 3112 [Zjoi2013]防守战线

    题解:单纯形:转化为对偶问题: 对于最大化 cx,满足约束 Ax<=b ,x>0 对偶问题为 最小化 bx,满足约束 ATx>=c ,x>0 (AT为A的转置) 这一题的内存真 ...

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

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

  10. bzoj3550: [ONTAK2010]Vacation&&bzoj3112: [Zjoi2013]防守战线

    学了下单纯形法解线性规划 看起来好像并不是特别难,第二个code有注释.我还有...*=-....这个不是特别懂 第一个是正常的,第二个是解对偶问题的 #include<cstdio> # ...

随机推荐

  1. Visual Studio 2019 使用C语言创建动态链接库(Dll)并使用C语言和C#实现调用

    参考网址:https://blog.csdn.net/weixin_34976988/article/details/99625533 一.创建DLL1.建立动态链接库项目 2.创建头文件和源文件 删 ...

  2. WPF 显示3D密集场景,堆场管理系统

    又好久好久没写博客了,这次接着上文https://www.cnblogs.com/CSSZBB/p/12785380.html,上文用WPF 的绘图功能,制作了一个伪3D的2.5D控件ThreeDBo ...

  3. nuxt.js服务端渲染中less的配置和使用

    第一步:npm 安装 less 和 less-loader ,文件根目录下安装,指令如下 npm install less less-loader --save-dev 第二步:直接在组件中使用 &l ...

  4. 【spring】69道Spring面试题和答案

    原文地址:http://ifeve.com/spring-interview-questions-and-answers/ 目录 Spring 概述 依赖注入 Spring beans Spring注 ...

  5. 阿里云sql监控配置-druid

    今天我们说说数据源和数据库连接池,熟悉java开发的同仁应该都了解C3PO,在这里不做过多的赘述了,今天我们说的是阿里DRUID,druid是后起之秀,因为它的优秀很快占领了使用市场,下边我们一起来看 ...

  6. linux备份恢复命令

    dump 发行版不自带,需要 yum 或 apt 安装.安装时 restore 也会自动安装. 支持分区和增量备份(仅支持分区增量,目录备份不支持增量).(第一次完全备份,第二次及以后只备份增加和修改 ...

  7. 从新建文件夹开始构建ShadowPlay Engine(5)

    本篇序言 从本篇开始,我们要开始构建引擎核心中的系统组件部分,广义上讲其实我们从开始到现在一直都是在构建引擎核心中的系统部分,但严格的定义中系统组件大概有这么几个:内存管理,线程管理,文件管理,时间系 ...

  8. git01_常用命令

    git与github介绍 Git是什么 Git是一个开源的[分布式][版本控制系统],用于敏捷高效地处理任何或小或大的项目 版本控制器 CVS/SVN/Git SVN 客户端/服务器 GIT 客户端/ ...

  9. epoll经典代码示例

    1. epoll原理 原理性的知识不再另做说明,我在这里附上收藏整理的两篇经典文章: select与epoll的本质关系. select.poll.epoll之间的区别. 2. epoll服务器端经典 ...

  10. Configuration对象和SessionFactory会话池

    一.加载核心配置文件方式 二.加载映射文件方式 三.SessionFactory相当于连接池 四.获取session会话 同一个线程中获取的session两种方法获取的是同一个session对象: 不 ...