BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]
2017-03-11 16:08
274 查看
传送门
题意:
长为$n$的序列,第$i$位至少$b_i$,$m$种区间使$[l_i,r_i]+1$代价为$a_i$
求满足的最小花费
复习单纯形法重做一遍
原始问题$m$个变量$n$个约束,$a_{ij}=1$当$l_j \le i \le r_j$
对偶问题$n$个变量$m$个约束
$Max\quad \sum\limits_{i=1}{n}b_iy_i$
$Sat\quad \sum\limits_{l_i \le j \le r_i}y_j \le c_i,\quad y_i \ge 0$
加入对全幺模矩阵的优化后快了1倍
题意:
长为$n$的序列,第$i$位至少$b_i$,$m$种区间使$[l_i,r_i]+1$代价为$a_i$
求满足的最小花费
复习单纯形法重做一遍
原始问题$m$个变量$n$个约束,$a_{ij}=1$当$l_j \le i \le r_j$
对偶问题$n$个变量$m$个约束
$Max\quad \sum\limits_{i=1}{n}b_iy_i$
$Sat\quad \sum\limits_{l_i \le j \le r_i}y_j \le c_i,\quad y_i \ge 0$
加入对全幺模矩阵的优化后快了1倍
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const int N=1005,M=1e4+5; const double INF=1e15,eps=1e-8; inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int n,m; double a[M] ; int q ; void Pivot(int l,int e){ double t=a[l][e];a[l][e]=1; for(int j=0;j<=n;j++) a[l][j]/=t; int p=0; for(int j=0;j<=n;j++) if(abs(a[l][j])>eps) q[++p]=j; for(int i=0;i<=m;i++) if(i!=l && abs(a[i][e])>eps){ double t=a[i][e];a[i][e]=0; for(int j=1;j<=p;j++) a[i][q[j]]-=t*a[l][q[j]]; } } void simplex(){ while(true){ int l=0,e=0; double mn=INF; for(int j=1;j<=n;j++) if(a[0][j]>eps) {e=j;break;} if(!e) return; for(int i=1;i<=m;i++) if(a[i][e]>eps && a[i][0]/a[i][e]<mn) {mn=a[i][0]/a[i][e];l=i;} if(!l) return;//unbounded Pivot(l,e); } } int main(){ freopen("in","r",stdin); n=read();m=read(); for(int i=1;i<=n;i++)a[0][i]=read(); for(int i=1;i<=m;i++){ int l=read(),r=read(),c=read(); a[i][0]=c; for(int j=l;j<=r;j++) a[i][j]=1; } simplex(); printf("%d",int(-a[0][0]+0.5)); }
相关文章推荐
- BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记看另一篇吧】
- 【bzoj1061】 Noi2008—志愿者招募
- BZOJ1061: [Noi2008]志愿者招募
- [BZOJ1061][Noi 2008]志愿者招募(网络流)
- BZOJ 1061: [Noi2008]志愿者招募【单纯形裸题】
- bzoj 1061: [Noi2008]志愿者招募
- [BZOJ1061] [NOI2008] 志愿者招募 - 最小费用最大流
- Bzoj1061:[Noi2008]志愿者招募:单纯形算法
- BZOJ1061: [Noi2008]志愿者招募
- BZOJ1061: [Noi2008]志愿者招募 && 单纯形学习笔记
- [单纯形+对偶] BZOJ1061: [Noi2008]志愿者招募
- bzoj1061: [Noi2008]志愿者招募
- BZOJ 1061: [Noi2008]志愿者招募(最小费用最大流)
- 单纯型法Ⅱ(bzoj 1061: [Noi2008]志愿者招募)
- 【BZOJ 1061】【Vijos 1825】【NOI 2008】志愿者招募
- bzoj 1061: [Noi2008]志愿者招募【最小费用最大流】
- BZOJ 1061: [Noi2008]志愿者招募
- 【费用流】BZOJ1061: [Noi2008]志愿者招募(这题超好)
- 【BZOJ】1061: [Noi2008]志愿者招募(费用流+数学)
- NOI 2008 志愿者招募 BZOJ 1061