zoukankan      html  css  js  c++  java
  • 单纯形法模板

     1 #include <bits/stdc++.h>
     2 #define eps 1e-8
     3 #define INF 1e100
     4 using namespace std;
     5 long double a[105][105],x[205],ans,c[105];
     6 int n,m,xx,yy,t,B[105],N[105],d[105],tt;
     7 void pivot(int l,int e)
     8 {
     9     swap(B[l],N[e]);
    10     for(int i=0;i<=n;i++)if(i!=e)a[l][i]/=a[l][e];
    11     a[l][e]=(long double)1/a[l][e];
    12     for(int i=0;i<=m;i++)if(i!=l&&fabs(a[i][e])>eps)
    13     {
    14         for(int j=0;j<=n;j++)if(j!=e)a[i][j]-=a[i][e]*a[l][j];
    15         a[i][e]=-a[i][e]*a[l][e];
    16     }
    17 }
    18 int simplex()
    19 {
    20     int l,e;
    21     while(1)
    22     {
    23         e=n+1; tt=0;
    24         for(int i=1;i<=n;i++)if(a[0][i]>eps)d[++tt]=i;
    25         if(tt==0)break; e=d[rand()%tt+1]; long double temp=INF;
    26         for(int i=1;i<=m;i++)if((a[i][e]>eps)and(a[i][0]/a[i][e]<temp)){ l=i; temp=a[i][0]/a[i][e]; }
    27         if(temp==INF){ printf("Unbounded
    "); return 0; }
    28         pivot(l,e);
    29     }
    30     ans=-a[0][0]; return 1;
    31 }
    32 int main()
    33 {
    34     scanf("%d%d%d
    ",&n,&m,&t);
    35     for(int i=1;i<=n;i++)scanf("%Lf",&c[i]); a[0][n+1]=-1;
    36     for(int i=1;i<=n;i++)N[i]=i; N[n+1]=0;
    37     for(int i=1;i<=m;i++)B[i]=n+i;
    38     for(int i=1;i<=m;i++)
    39     {
    40         for(int j=1;j<=n;j++)scanf("%Lf",&a[i][j]); a[i][n+1]=-1;
    41         scanf("%Lf",&a[i][0]);
    42     }
    43     n++; int mm=1; for(int i=2;i<=m;i++)if(a[i][0]<a[mm][0])mm=i; 
    44     if(a[mm][0]<-eps)pivot(mm,n);
    45     if(!simplex())return 0;
    46     if(ans<-eps){ printf("Infeasible
    "); return 0; }
    47     xx=0; for(int i=1;i<=n;i++)if(N[i]==0){ xx=i; break; }
    48     if(xx==0)
    49     {
    50         yy=0;
    51         for(int i=1;i<=m;i++)if(B[i]==0){ yy=i; break; }
    52         for(xx=0;xx<=n;xx++)if(abs(a[yy][xx])>eps)break; 
    53         if(xx<=n)pivot(yy,xx);
    54     }
    55     if(xx<=n)
    56     {
    57         for(int i=xx;i<=n-1;i++)N[i]=N[i+1]; N[n]=0;
    58         for(int i=1;i<=m;i++)for(int j=xx;j<=n-1;j++)a[i][j]=a[i][j+1];
    59         n--; for(int i=0;i<=n;i++)a[0][i]=0;
    60         for(int i=1;i<=n;i++)
    61         {
    62             xx=0; for(int j=1;j<=n;j++)if(N[j]==i){ xx=j; break; }
    63             if(xx>0)a[0][xx]+=c[i];else
    64             {
    65                 for(int j=1;j<=m;j++)if(B[j]==i){ xx=j; break; }
    66                 for(int j=0;j<=n;j++)a[0][j]=a[0][j]-c[i]*a[xx][j];
    67             }
    68         }
    69     }else
    70     {
    71         for(int i=yy;i<=m-1;i++)for(int j=0;j<=n;j++)a[i][j]=a[i+1][j];
    72         m--;
    73     }
    74     if(!simplex())return 0;
    75     printf("%.10Lf
    ",ans);
    76     if(t==1)
    77     {
    78         for(int i=1;i<=m;i++)x[B[i]]=a[i][0];
    79         for(int i=1;i<=n;i++)printf("%.10Lf ",x[i]);
    80         printf("
    ");
    81     }
    82     return 0;
    83 }
    View Code
  • 相关阅读:
    Xamarin.Android开发实践(十八)
    Xamarin.Android开发实践(十七)
    smokeping网络监控
    Cobbler自动化部署
    在线编辑器KindEditor的使用
    前端之快速创建标签
    Tornado之自定义异步非阻塞的服务器和客户端
    算法基础知识之树、二叉树
    Tornado之实例和扩展
    Scrapy源码研究前戏
  • 原文地址:https://www.cnblogs.com/GhostReach/p/8143494.html
Copyright © 2011-2022 走看看