uva-10498-线性规划

来源:互联网 发布:征服者更新用什么网络 编辑:程序博客网 时间:2024/06/01 20:41

题目大意:标准的线性规划,m个约束条件都是小于等于;

题目解析:单纯形法模板;

AC代码:

#include <iostream>#include <cstdio>#include <cmath>using namespace std;const double dinf=1e10;const int MAX=55;int n,m,B[MAX],N[MAX];double A[MAX][MAX],b[MAX],c[MAX],v;double ans[MAX];int sgn(double x){    if(x>1e-8) return 1;    if(x<-1e-8) return -1;    return 0;}void init(){    int i,j;    for(i=1;i<=n;i++) N[i]=i;    for(i=1;i<=m;i++) B[i]=n+i;    v=0;}void pivot(int l,int e){    int i,j;    double temp=A[l][e];    b[l]/=temp; A[l][e]=1/temp;    for(i=1;i<=n;i++) if(i!=e) A[l][i]/=temp;    for(i=1;i<=m;i++) if(i!=l)    {        b[i]-=A[i][e]*b[l];        for(j=1;j<=n;j++) if(j!=e) A[i][j]-=A[i][e]*A[l][j];        A[i][e]=-A[i][e]/temp;    }    v+=b[l]*c[e];    for(i=1;i<=n;i++) if(i!=e) c[i]-=c[e]*A[l][i];    c[e]*=-A[l][e];    swap(B[l],N[e]);}void simplex(){    int i,j,k,x;    int l,s;    double temp,temp1,temp2,temp3;    while(1)    {        temp2=-dinf; s=-1;        for(i=1;i<=n;i++) if(sgn(c[i])>0)        {            temp=dinf;            for(k=1;k<=m;k++) if(sgn(A[k][i])>0)            {                temp3=b[k]/A[k][i];                if(temp3<temp) temp=temp3,x=k;            }            if(temp2<temp*c[i])            {                s=i,l=x,temp2=temp*c[i];            }        }        if(s==-1) break;        pivot(l,s);    }    for(i=1;i<=n;i++)    {        for(j=1;j<=m;j++) if(B[j]==i) break;        if(j<=m) ans[i]=b[j];        else ans[i]=0;    }}int main(){    while(scanf("%d%d",&n,&m)!=-1)    {        int i,j;        for(i=1;i<=n;i++) scanf("%lf",&c[i]);        for(i=1;i<=m;i++)        {            for(j=1;j<=n;j++) scanf("%lf",&A[i][j]);            scanf("%lf",&b[i]);        }        init();        simplex();        printf("Nasa can spend %.0lf taka.\n",ceil(v*m));    }    return 0;}


原创粉丝点击