P3337-[ZJOI2013]防守战线【单纯形】
正題
題目鏈接:https://www.luogu.com.cn/problem/P3337
題目大意
nnn個地方可以建立塔也可以不建立塔,第iii個位置建立需要消耗CiC_iCi?元
mmm個限制要求在某個區間內的塔的數量超過DiD_iDi?
1≤n≤1000,1≤m≤100001\leq n\leq 1000,1\leq m\leq 100001≤n≤1000,1≤m≤10000
題目大意
抽象成數學模型的話
minimize∑i=1nCiximinimize\ \ \sum_{i=1}^nC_ix_iminimize??i=1∑n?Ci?xi?
∑lirixi,j≥Di\sum_{l_i}^{r_i}x_{i,j}\geq D_ili?∑ri??xi,j?≥Di?
然后網絡流好像草不過去,考慮點線性規劃玄學算法
先把它對偶了
maximize∑i=1nDiximaximize\ \ \sum_{i=1}^nD_ix_imaximize??i=1∑n?Di?xi?
∑lirixi,j≤Ci\sum_{l_i}^{r_i}x_{i,j}\leq C_ili?∑ri??xi,j?≤Ci?
然后就是一個裸的單純形了。
所以單純形是什么,這里就粗略的講一下。
我是看線性規劃與單純形算法-吳一凡的課件學的
對于普通的松弛型有三個限制:
定義所有的xn+ix_{n+i}xn+i?為基變量,xi(i≤n)x_i(i\leq n)xi?(i≤n)為非基變量
然后單純形的流程就是先找出任意一個cic_ici?為正的基變量xpx_pxp?
然后去掉所有其他非基變量后得到一個對于xpx_pxp?最小的限制,即最小的cpap,z\frac{c_p}{a_{p,z}}ap,z?cp??
然后考慮交換非基變量xpx_pxp?和基變量xz+nx_{z+n}xz+n?,此時可以得到一個由第zzz行的式子推出的關于xpx_pxp?的式子,帶入回到需要最大化的式子當中。此時由于cic_ici?為正,所以式子中會有一個正的常數。
此時這個常數就相當于大化了那個式子,不停重復上面的轉軸操作直到無法找到正的cic_ici?為止(此時就代表無法繼續擴大了)
這個是實數的,但是我們這題的要求是整數,但是我們這里的約束矩陣AAA是一個全幺模矩陣,所以至少保證有一組最優解全是整數,又不用輸出方案,直接單純形暴艸就可以了
復雜度比較玄學,但是能過這題
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]防守战线【单纯形】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 秦始皇灭六国的顺序是什么
- 下一篇: 四月说说句子