【BZOJ3112】[Zjoi2013]防守战线 单纯形法
【BZOJ3112】[Zjoi2013]防守战线
题解:依旧是转化成对偶问题,然后敲板子就行了~
建完表后发现跟志愿者招募的表正好是相反的,感觉很神奇~
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> using namespace std; const double inf=1e12; const double eps=1e-6; double A[1010][10010]; int p[10010]; int n,m; int rd() { int ret=0,f=1; char gc=getchar(); while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();} while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar(); return ret*f; } void pivot(int l,int e) { double t=A[l][e];A[l][e]=1; int i,j; for(j=0;j<=n;j++) A[l][j]/=t; for(p[0]=j=0;j<=n;j++) if(fabs(A[l][j])>eps) p[++p[0]]=j; for(i=0;i<=m;i++) if(i!=l&&fabs(A[i][e])>eps) { t=A[i][e],A[i][e]=0; for(j=1;j<=p[0];j++) A[i][p[j]]-=t*A[l][p[j]]; } } void simplex() { while(1) { double mn=inf; int i,l=0,e=0; for(i=1;i<=n;i++) if(A[0][i]>eps) { e=i; break; } if(!e) return; for(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; pivot(l,e); } } int main() { m=rd(),n=rd(); int i,j,l,r; for(i=1;i<=m;i++) A[i][0]=rd(); for(i=1;i<=n;i++) { l=rd(),r=rd(),A[0][i]=rd(); for(j=l;j<=r;j++) A[j][i]=1; } simplex(); printf("%d",int(-A[0][0]+0.5)); return 0; }
| 欢迎来原网站坐坐! >原文链接<