正题

题目链接: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. 如果被问到 HTTP 协议,你真的能讲清楚吗?

    前段时间,在和许久未见的老同学聊天时,突然被问到 http 协议到底是什么?脑海里面第一时间想起来的就是 request 请求.response 响应之类的词汇,但是这样讲他真的能知道是什么吗?我反问 ...

  2. SpringBoot配置Cors跨域请求

    一.同源策略简介 同源策略[same origin policy]是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石. 什么是源 源[or ...

  3. 深入浅出Mybatis系列(一)---Mybatis简介

    1.什么是MyBatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且 ...

  4. 区间k大数训练

    问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数 ...

  5. MySQL-库表操作详述

    一.库操作 创建库 create database 库名(charset utf8 对库的编码进行设置,不写就用默认值) 库名可以由字母.数字.下划线.特殊字符,要区分大小写,唯一性,不能使用关键字, ...

  6. Panel添加边框颜色和边框粗细调整

    Panel控件添加边框颜色 C# WinForm窗体控件Panel修改边框颜色以及边框宽度方法 - JiYF - 博客园 (cnblogs.com) 1.新建一个用户控件的项目,如下: 2.添加一个P ...

  7. jq的slideToggle效果

    slideToggle() 方法通过使用滑动效果(高度变化)来切换元素的可见状态. 如果被选元素是可见的,则隐藏这些元素,如果被选元素是隐藏的,则显示这些元素. 例子:一个简单的下拉菜单效果----& ...

  8. Appium问题解决方案(10)- Original error: Swipe did not complete successfully

    背景 从搜索页面返回首页之后,执行  swipe 滑动操作,但是报错了,如上图 解决方法 只需要在第一次 swipe 之前加个 sleep,强制等待即可 备注 这种解决方案其实不好,强制等待能少用就少 ...

  9. 硕盟type-c转接头|四合一多功能扩展坞

    硕盟SM-T54是一款 TYPE C转HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞,支持四口同时使用,您可以将含有USB 3.1协议的电脑主机,通过此产品连接到具有HDMI或VGA的显 ...

  10. 妙用 background 实现花式文字效果

    本文将讲解如何利用 background 系列属性,巧妙的实现一些花式的文字效果.通过本文,你将可以学到: 通过 background-size 与 background-position 实现酷炫的 ...