单纯形 BZOJ3112: [Zjoi2013]防守战线
题面自己上网查。
学了一下单纯形。当然 证明什么的 显然是没去学。不然估计就要残废了
上学期已经了解了 什么叫标准型。 听起来高大上 其实没什么
就是加入好多松弛变量+各种*(-1),使得最后成为一般形式:
给定A[][],求满足A[i][j]*Xj<=A[i][0];(0<i<=n,0<j<=m)
使A[0][j]*Xj最大的X[];
如果题面中直接得出的条件是A[i][j]*Xj>=A[i][0]; 使 A[0][j]*Xj最小。
那么就要用对偶定理,变成 A[i][j]*Yi<=A[0][j] 使A[i][0]*Yi最大
(实际上只要把A转置一下就好了)
才写了两题单纯形,具体的怎么求Xi之类的 还没学,这里先放代码,之后再补
#include <bits/stdc++.h>
#define N 1005
#define M 10005
using namespace std;
const double eps=0.00000000001;
const double inf=;
double a[N][M]; int n,m,x,y;
void simplex(){
while (){
int x=,y=; double mn=inf,t;
for (int i=;i<=m;++i) if (a[][i]>eps) {y=i; break;} //找一个可以使答案增加的xi 只要系数为正就可以
if (!y) return; //没有了 说明答案已经不能再增加了
for (int i=;i<=n;++i) if (a[i][y]>eps&&a[i][]/a[i][y]<mn) mn=a[x=i][]/a[i][y]; //对找到的xi ,求出约束最紧的一条约束
if (!x) {a[][]=-inf; return;} //表示 可以无限增加
t=a[x][y]; a[x][y]=;
for (int i=;i<=m;++i) a[x][i]/=t;
for (int i=;i<=n;++i) if (i!=x&&abs(a[i][y])>eps){
t=a[i][y]; a[i][y]=; for (int j=;j<=m;++j) a[i][j]-=t*a[x][j];
}
}
}
int main(){
scanf("%d%d",&n,&m);
for (int i=;i<=n;++i) scanf("%lf",&a[i][]);
for (int i=;i<=m;++i){
scanf("%d%d%lf",&x,&y,&a[][i]);
for (int j=x;j<=y;++j) ++a[j][i];
}
simplex();
printf("%.0lf",round(-a[][]));
return ;
}
好短啊
18年来补。
UOJ的板子题。。应该比较科学了(忽略中间那个assert)
。还有就是 ,单纯形真的不靠谱,,还要random才能过?。。
#include <bits/stdc++.h>
#define DB long double
using namespace std;
const DB eps=0.000000001;
int n,m,T,k,t,o[],c[];
DB tmp[],a[][];
void SWAP(int k,int t){
swap(o[k],c[t]);
DB x=a[k][t]; a[k][t]=;
for (int j=;j<=n;++j) a[k][j]/=x;
for (int i=;i<=m;++i)
if (i!=k){
x=a[i][t]; a[i][t]=;
for (int j=;j<=n;++j) a[i][j]-=x*a[k][j];
}
}
int main(){
scanf("%d%d%d",&n,&m,&T);
for (int i=;i<=n;++i) scanf("%Lf",&tmp[i]);
for (int i=;i<=n;++i) c[i]=i;
for (int i=;i<=m;++i){
for (int j=;j<=n;++j) scanf("%Lf",&a[i][j]);
scanf("%Lf",&a[i][]); o[i]=i+n;
}
k=-;
for (int i=;i<=m;++i)
if (a[i][]<&&(k==-||a[i][]<a[k][])) k=i;
if (~k){
++n; c[n]=n+m;
for (int i=;i<=m;++i) a[i][n]=-;
SWAP(k,n);
while (){
t=-;
for (int j=n;j;--j)
if (a[][j]>eps) {t=j; if (rand()&) break;}
if (t==-) break;
k=-;
for (int i=;i<=m;++i)
if (a[i][t]>eps)
if (k==-||a[i][]/a[i][t]<a[k][]/a[k][t]) k=i;
SWAP(k,t);
}
if (fabs(a[][])>eps){
puts("Infeasible"); return ;
}
k=t=-;
for (int i=;i<=n;++i) if (c[i]==n+m) t=i;
for (int i=;i<=m;++i) if (o[i]==n+m) k=i;
if (~k){
for (int j=;j<=n;++j)
if (fabs(a[k][j])>eps) {t=j; break;}
if (t==-){
assert(); swap(o[k],o[m]);
for (int j=;j<=n;++j) swap(a[k][j],a[m][j]);
--m;
}else{
SWAP(k,t); swap(c[t],c[n]);
for (int i=;i<=m;++i) swap(a[i][t],a[i][n]);
--n;
}
}else{
swap(c[t],c[n]);
for (int i=;i<=m;++i) swap(a[i][t],a[i][n]);
--n;
}
}
for (int i=;i<=n;++i) a[][i]=;
for (int i=;i<=n;++i)
if (c[i]<=n) a[][i]+=tmp[c[i]];
for (int i=;i<=m;++i)
if (o[i]<=n)
for (int j=;j<=n;++j)
a[][j]-=tmp[o[i]]*a[i][j];
while (){
t=-;
for (int j=n;j;--j)
if (a[][j]>eps) {t=j; if (rand()&) break;}
if (t==-) break;
k=-;
for (int i=;i<=m;++i)
if (a[i][t]>eps)
if (k==-||a[i][]/a[i][t]<a[k][]/a[k][t]) k=i;
if (k==-){
puts("Unbounded");
return ;
}
SWAP(k,t);
}
printf("%.10Lf\n",-a[][]);
if (T){
for (int i=;i<=n;++i) tmp[c[i]]=;
for (int i=;i<=m;++i) tmp[o[i]]=a[i][];
for (int i=;i<=n;++i) printf("%.10Lf ",tmp[i]);
puts("");
}
return ;
}
天壌を翔る者たち
单纯形 BZOJ3112: [Zjoi2013]防守战线的更多相关文章
- BZOJ3112 [Zjoi2013]防守战线 【单纯形】
题目链接 BZOJ3112 题解 同志愿者招募 费用流神题 单纯形裸题 \(BZOJ\)可过 洛谷被卡.. #include<algorithm> #include<iostream ...
- bzoj3112 [Zjoi2013]防守战线
正解:线性规划. 直接套单纯形的板子,因为所约束条件都是>=号,且目标函数为最小值,所以考虑对偶转换,转置一下原矩阵就好了. //It is made by wfj_2048~ #include ...
- bzoj3550: [ONTAK2010]Vacation&&bzoj3112: [Zjoi2013]防守战线
学了下单纯形法解线性规划 看起来好像并不是特别难,第二个code有注释.我还有...*=-....这个不是特别懂 第一个是正常的,第二个是解对偶问题的 #include<cstdio> # ...
- 【BZOJ3112】[Zjoi2013]防守战线 单纯形法
[BZOJ3112][Zjoi2013]防守战线 题解:依旧是转化成对偶问题,然后敲板子就行了~ 建完表后发现跟志愿者招募的表正好是相反的,感觉很神奇~ #include <cstdio> ...
- BZOJ 3112 Zjoi2013 防守战线 单纯形
题目大意: 单纯形*2.. . #include <cmath> #include <cstdio> #include <cstring> #include < ...
- ZJOI2013 防守战线
题目 战线可以看作一个长度为\(n\)的序列,现在需要在这个序列上建塔来防守敌兵,在序列第\(i\)号位置上建一座塔有\(C_i\)的花费,且一个位置可以建任意多的塔,费用累加计算.有\(m\)个区间 ...
- BZOJ 3112: [Zjoi2013]防守战线 [单纯形法]
题目描述 战线可以看作一个长度为n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第i 号位置上建一座塔有Ci 的花费,且一个位置可以建任意多的塔,费用累加计算.有m 个区间[L1, R1], [ ...
- BZOJ 3112 [Zjoi2013]防守战线
题解:单纯形:转化为对偶问题: 对于最大化 cx,满足约束 Ax<=b ,x>0 对偶问题为 最小化 bx,满足约束 ATx>=c ,x>0 (AT为A的转置) 这一题的内存真 ...
- 数学(线性规划): ZJOI2013 防守战线
偷懒用的线性规划. #include <iostream> #include <cstring> #include <cstdio> using namespace ...
随机推荐
- [Tyvj1939] 玉蟾宫(单调栈)
传送门 题目 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写 ...
- Codeforces917D. Stranger Trees
$n \leq 100$的完全图,对每个$0 \leq K \leq n-1$问生成树中与给定的一棵树有$K$条公共边的有多少个,答案$mod \ \ 1e9+7$. 对这种“在整体中求具有某些特性的 ...
- Oracle: 通过命令行下载安装文件
1. 导出oracle cookies 参考:https://blog.pythian.com/how-to-download-oracle-software-using-wget-or-curl/ ...
- 【Nginx】基本数据结构
整型的封装 typedef intptr_t ngx_int _t;//有符号整型 typedef uintptr_t ngx_uint_t;//无符号整型 字符串的封装 typedef struct ...
- C#:excel导入导出
资源:excelService 服务 http://download.csdn.net/detail/istend/8060501 排列问题 导出时,数字和字符的排列格式默认不一样,数字靠右,字符靠左 ...
- Office WORD如何去掉目录的背景灰色
有人说鼠标点击空白的地方灰色就自动散掉了,但是我点击并没有散掉 鼠标选中有灰色背景的文字,点击格式-边框和底纹,点击无填充颜色,并应用于文字. O了
- 社交O2O的进化
引言 谁都想在O2O这个狂热的概念下分一杯羹,从O2O兴趣社交延伸到O2O生活服务,移动社交APP也是各显神通. 早在微信4.2版本号里,开机界面里那句"少发微信.多和朋友见见面" ...
- leetcode ----Trie/stack专题
一:Implement Trie (Prefix Tree) 题目: Implement a trie with insert, search, and startsWith methods. Not ...
- SPOJ QTREE6 lct
题目链接 岛娘出的题.还是比較easy的 #include <iostream> #include <fstream> #include <string> #inc ...
- ubuntu下spring环境搭建
一.安装JDK 下载官网:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 部署: ...