uva-10498-線性規劃

題目大意:標準的線性規劃,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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章