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

     1 #include <cstdio>
     2 #include <algorithm>
     3  
     4 #define rep(i, l, r) for(int i=l; i<=r; i++)
     5      
     6 using namespace std;
     7  
     8 inline int read()
     9 {
    10     int x=0; bool f=0; char ch=getchar();
    11     while (ch<'0' || '9'<ch) f|=ch=='-', ch=getchar();
    12     while ('0'<=ch && ch<='9') x=x*10+ch-'0', ch=getchar();
    13     return f?-x:x;
    14 }
    15  
    16 #define maxn 21
    17 #define eps 1e-8
    18  
    19 int n, m, op, tot, q[maxn], idx[maxn], idy[maxn]; double a[maxn][maxn], A[maxn];
    20  
    21 inline void Pivot(int x, int y)
    22 {
    23     swap(idy[x],idx[y]);
    24     double tmp=a[x][y]; a[x][y]=1/a[x][y];
    25     rep(i, 0, n) if (y!=i) a[x][i]/=tmp;
    26     tot=0; rep(i, 0, n) if (i!=y && (a[x][i]>eps || a[x][i]<-eps)) q[++tot]=i;
    27     rep(i, 0, m)
    28     {
    29         if ((x==i) || (a[i][y]<eps && a[i][y]>-eps)) continue;
    30         rep(j, 1, tot) a[i][q[j]]-=a[x][q[j]]*a[i][y];
    31         a[i][y]=-a[i][y]/tmp;
    32     }
    33 }
    34  
    35 int main()
    36 {
    37     n=read(), m=read(), op=read();
    38     rep(i, 1, n) a[0][i]=read();
    39     rep(i, 1, m)
    40     {
    41         rep(j, 1, n) a[i][j]=read();
    42         a[i][0]=read();
    43     }
    44      
    45     rep(i, 1, n) idx[i]=i;
    46     rep(i, 1, m) idy[i]=i+n;
    47     while (true)
    48     {
    49         int x=0, y=0;
    50         rep(i, 1, m) if (a[i][0]<-eps && ((!x)||(rand()&1))) x=i; if (!x) break;
    51         rep(i, 1, n) if (a[x][i]<-eps && ((!y)||(rand()&1))) y=i; if (!y) return puts("Infeasible"),0;
    52         Pivot(x,y);
    53     }
    54      
    55     while (true)
    56     {
    57         int x=0, y=0; double mn=1e15;
    58         rep(i, 1, n) if (a[0][i]>eps) {y=i; break;} if (!y) break;
    59         rep(i, 1, m) if (a[i][y]>eps && a[i][0]/a[i][y]<mn) mn=a[i][0]/a[i][y], x=i; if (!x) return puts("Unbounded"),0;
    60         Pivot(x,y);
    61     }
    62      
    63     printf("%.8lf
    ", -a[0][0]); if (!op) return 0;
    64     rep(i, 1, m) if (idy[i]<=n) A[idy[i]]=a[i][0];
    65     rep(i, 1, n) printf("%.8lf%c", A[i], i==n?'
    ':' ');
    66      
    67     return 0;
    68 }
  • 相关阅读:
    Oil Deposits UVA
    工作区的颜值选择(中等)
    计算机网络 自定向下方法1.1-1.2
    工作区的颜值选择(简单)
    排序算法之简单选择排序
    排序算法之直接插入排序
    查找算法之查找一个数组中只出现过一次的数
    查找算法之查找一个数组中两两数字相同,只有其中两个数字是不一样的,将其找出
    Linux
    ASP.NET Web – 状态管理
  • 原文地址:https://www.cnblogs.com/myx12345/p/6482657.html
Copyright © 2011-2022 走看看