zoukankan      html  css  js  c++  java
  • UOJ#179. 线性规划[模板]

    传送门 http://uoj.ac/problem/179

    震惊,博主竟然还不会线性规划!

    单纯形实在学不会啊……背个板子当黑盒用……

    学(chao)了NanoApe dalao的板子

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<cmath>
     6 using namespace std;
     7 const double eps=1e-8;
     8 const int mxn=110;
     9 int read(){
    10     int x=0,f=1;char ch=getchar();
    11     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 
    16 int n,m,t;
    17 double c[mxn];
    18 double a[mxn][mxn];
    19 int idx[mxn],idy[mxn];
    20 int st[mxn],top=0;
    21 void Pivot(int x,int y){//用idy代换idx
    22     swap(idy[x],idx[y]);
    23     double tmp=a[x][y];a[x][y]=1/a[x][y];
    24     int i,j;top=0;
    25     for(i=0;i<=n;i++)if(y!=i)a[x][i]/=tmp;
    26     for(i=0;i<=n;i++)if((y!=i) && fabs(a[x][i])>eps)st[++top]=i;
    27     for(i=0;i<=m;i++){
    28         if((i==x)||(fabs(a[i][y])<eps))continue;
    29         for(j=1;j<=top;j++)a[i][st[j]]-=a[x][st[j]]*a[i][y];
    30         a[i][y]=-a[i][y]/tmp;
    31     }
    32     return;
    33 }
    34 void Simplex(){
    35     int i,j;
    36     while(1){
    37         int x=0,y=0;double mn=1e15;
    38         for(i=1;i<=n;i++)if(a[0][i]>eps){y=i;break;}
    39         if(!y)break;
    40         for(i=1;i<=m;i++){
    41             if(a[i][y]>eps && (a[i][0]/a[i][y]<mn)){
    42                 mn=a[i][0]/a[i][y];
    43                 x=i;
    44             }
    45         }
    46         if(!x){printf("Unbounded
    ");exit(0);}
    47         Pivot(x,y);
    48     }
    49     return;
    50 }
    51 int main(){
    52     int i,j;
    53     n=read();m=read();t=read();
    54     for(i=1;i<=n;i++)a[0][i]=read();//目标函数
    55     for(i=1;i<=m;i++){
    56         for(j=1;j<=n;j++)a[i][j]=read();
    57         a[i][0]=read();
    58     }
    59     for(i=1;i<=n;i++)idx[i]=i;//基变量 
    60     for(i=1;i<=m;i++)idy[i]=i+n;//非基变量 
    61     while(1){
    62         int x=0,y=0;
    63         for(i=1;i<=m;i++)if(a[i][0]<-eps && ((!x)||(rand()&1)))x=i;
    64         if(!x)break;
    65         for(i=1;i<=n;i++)if(a[x][i]<-eps && ((!y)||(rand()&1)))y=i;
    66         if(!y){printf("Infeasible
    ");return 0;}
    67         Pivot(x,y);
    68     }
    69     Simplex();
    70     printf("%.8f
    ",-a[0][0]);
    71     if(!t)return 0;
    72     for(i=1;i<=n;i++)a[0][i]=0;
    73     for(i=1;i<=m;i++)if(idy[i]<=n)a[0][idy[i]]=a[i][0];
    74     for(i=1;i<=n;i++)printf("%.8f ",a[0][i]);puts("");
    75     return 0;
    76 }
  • 相关阅读:
    PHP 实现简易 IOC 容器
    MySQL 5.7原生JSON格式支持
    PHP 使用 array_map 替代 foreach
    深入了解PHP闭包的使用以及实现
    PHP补全固定数字位数前面有0的值
    面试技巧
    Flex 布局语法教程
    如何在phpexcel中设置自动高度(自动换行)?
    宝塔面板和wdcp有什么区别?哪个比较好用?
    linux下如何查找nginx配置文件的位置
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6875566.html
Copyright © 2011-2022 走看看