• 模板:线性规划


     1 //数组开不下时勿用
     2 const int maxn=110;
     3 const double eps=1e-10;
     4 double a[maxn][maxn];
     5 double b[maxn],c[maxn],v;
     6 int N[maxn],B[maxn],n,m;
     7 
     8 int SGN(double x){
     9     return (x>eps)-(x<-eps);
    10 }
    11 
    12 void Init(){
    13     N[0]=B[0]=0;v=0.0;
    14     for(int i=1;i<=n;i++)N[++N[0]]=i;
    15     for(int i=1;i<=m;i++)B[++B[0]]=n+i;
    16 }
    17 
    18 void Pivot(int l,int e){
    19     b[e]=b[l]/a[l][e];
    20     a[e][l]=1.0/a[l][e];
    21     for(int i=1;i<=N[0];i++)
    22         if(N[i]!=e)a[e][N[i]]=a[l][N[i]]/a[l][e];
    23     
    24     for(int i=1;i<=B[0];i++)
    25         if(B[i]!=l){
    26             b[B[i]]-=a[B[i]][e]*b[e];
    27             a[B[i]][l]=-a[B[i]][e]*a[e][l];
    28             for(int j=1;j<=N[0];j++)
    29                 if(N[j]!=e)a[B[i]][N[j]]-=a[B[i]][e]*a[e][N[j]];
    30         }    
    31         
    32     v+=b[e]*c[e];
    33     c[l]=-c[e]*a[e][l];
    34     for(int i=1;i<=N[0];i++)
    35         if(N[i]!=e)c[N[i]]-=c[e]*a[e][N[i]];
    36     for(int i=1;i<=N[0];i++)if(N[i]==e)N[i]=l;
    37     for(int i=1;i<=B[0];i++)if(B[i]==l)B[i]=e;
    38 }
    39 
    40 bool Simplex(){
    41     while(true){
    42         double lam=-1;
    43         int e=maxn,l=maxn;
    44         for(int i=1;i<=N[0];i++)
    45             if(SGN(c[N[i]])>0&&e>N[i])
    46                 e=N[i];
    47         if(e==maxn)break;
    48         
    49         for(int i=1;i<=B[0];i++)
    50             if(SGN(a[B[i]][e])>0){
    51                 double tmp=b[B[i]]/a[B[i]][e];
    52                 if(lam==-1||SGN(tmp-lam)<0||SGN(tmp-lam)==0&&l>B[i])
    53                     lam=tmp,l=B[i];
    54             }
    55         if(l==maxn)return false;
    56         Pivot(l,e);    
    57     }
    58     return true;
    59 }

       这个是整数规划的模板,总能对,但正确性不显然。

     1 const int maxr=1010;
     2 const int maxc=10010;
     3 
     4 int n,m,nxt[maxc];
     5 int a[maxr][maxc];
     6 
     7 void Pivot(int l,int e){
     8     int pre=maxc-1;
     9     for(int i=0;i<=n;i++)
    10         if(a[l][i]!=0){nxt[pre]=i;pre=i;}
    11     nxt[pre]=-1;
    12             
    13     for(int i=0,t;i<=m;i++)
    14         if(i!=l&&(t=a[i][e])){
    15             a[i][e]=0;
    16             for(int j=nxt[maxc-1];j!=-1;j=nxt[j])
    17                 a[i][j]+=t*a[l][j];
    18         }
    19 }
    20 
    21 void Simplex(){
    22     while(true){
    23         int e=0,l=0;
    24         for(int i=1;i<=n;i++)
    25             if(a[0][i]>0){e=i;break;}
    26         if(e==0)break;        
    27         for(int i=1;i<=m;i++)
    28             if(a[i][e]<0&&(!l||a[l][0]>a[i][0]))
    29                 {l=i;}
    30         
    31         Pivot(l,e);    
    32     }
    33 }
  • 相关阅读:
    网络CCNA基础了解
    KVM 安装 VMware 虚拟机
    [转载]JS浏览器兼容性问题
    java中数组是不是对象?
    [转载]request.getServletPath()方法
    weblogic下更改jsp不生效的解决办法
    java之args[0]
    docker小demo
    eclipse优化
    [转载]oracle建表语句大全
  • 原文地址:https://www.cnblogs.com/TenderRun/p/5615408.html
Copyright © 2020-2023  润新知