• UOJ 179 线性规划


    这是一道模板题。
    本题中你需要求解一个标准型线性规划:
    有n个实数变量x1,x2,⋯,xn和m条约束,其中第i条约束形如aij*xj≤bi ,j∈(1,n),i∈(1,m)
    此外这n个变量需要满足非负性限制,即xj≥0。
    在满足上述所有条件的情况下,你需要指定每个变量xj的取值,使得目标函数F=cj*xj ,j∈(1,n)的值最大。

    输入格式
    第一行三个正整数 n,m,t。其中t∈{0,1}。
    第二行有n个整数c1,c2,⋯,cn,整数间均用一个空格分隔。
    接下来m行,每行代表一条约束,其中第i行有n+1个整数ai1,ai2,⋯,ain,bi,整数间均用一个空格分隔。
    输出格式
    如果不存在满足所有约束的解,仅输出一行”Infeasible”。
    如果对于任意的M,都存在一组解使得目标函数的值大于M,仅输出一行”Unbounded”。
    否则,第一行输出一个实数,表示目标函数的最大值F。当第一行与标准答案的相对误差或绝对误差不超过10−6,你的答案被判为正确。
    如果t=1,那么你还需要输出第二行,用空格隔开的n个非负实数,表示此时x1,x2,⋯,xn的取值,如有多组方案请任意输出其中一个。
    判断第二行是否合法时,我们首先检验F−cjxj,j∈(1,n)是否为0,再对于所有ii,检验min{0,bi−aijxj,j∈(1,n)}是否为0。检验时我们会将其中大于0的项和不大于0的项的绝对值分别相加得到S+和S−,如果S+和S−的相对误差或绝对误差不超过10−6,则判为正确。
    如果t=0,或者出现Infeasible或Unbounded时,不需要输出第二行。

    线性规划单纯型法模板

    这个模板不知为何被卡了,UOJ只有97分,玄学

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<ctime>
     7 #define eps (1e-8)
     8 #define inf (1e20)
     9 using namespace std;
    10 long double a[51][51],ans[51];
    11 int id[51],n,m,t;
    12 void pivot(int l,int e)
    13 {int i,j;
    14   swap(id[n+l],id[e]);
    15   long double t=a[l][e];a[l][e]=1.0;
    16   int arr[25],tot=0;
    17   for (i=0;i<=n;i++)
    18     if (fabs(a[l][i])>eps)
    19       {
    20       arr[++tot]=i;
    21       a[l][i]/=t;
    22       }
    23   for (i=0;i<=m;i++)
    24     if (i!=l&&fabs(a[i][e])>eps)
    25       {
    26       t=a[i][e];a[i][e]=0;
    27       for (j=1;j<=tot;j++)
    28         {
    29           a[i][arr[j]]-=t*a[l][arr[j]];
    30         }
    31       }
    32 }
    33 bool init()
    34 {int i,j;
    35   while (1)
    36     {
    37       int x=0,y=0;
    38       for (i=1;i<=m;i++)
    39       if (a[i][0]<=-eps&&(!x||rand()&1)) x=i;
    40       if (x==0) return 1;
    41       for (i=1;i<=n;i++)
    42       if (a[x][i]<=-eps&&(!y||rand()&1)) y=i;
    43       if (y==0) return 0;
    44       pivot(x,y);
    45     }
    46 }
    47 bool simplex()
    48 {int i;
    49   while (1)
    50     {
    51       int x=0,y=0;
    52       for (i=1;i<=n;i++)
    53       if (a[0][i]>eps)
    54         {x=i;break;}
    55       if (x==0) return 1;
    56       long double tmp;
    57       for (i=1;i<=m;i++)
    58       if (a[i][x]>eps&&(y==0||a[i][0]/a[i][x]<tmp))
    59         {
    60           tmp=a[i][0]/a[i][x];
    61           y=i;
    62         }
    63       if (y==0) return 0;
    64       pivot(y,x);
    65     }
    66 }
    67 int main()
    68 {int i,j;
    69   srand(time(0));
    70   cin>>n>>m>>t;
    71   for (i=1;i<=n;i++)
    72     scanf("%Lf",&a[0][i]);
    73   for (i=1;i<=m;i++)
    74     {
    75       for (j=1;j<=n;j++)
    76       {
    77         scanf("%Lf",&a[i][j]);
    78       }
    79       scanf("%Lf",&a[i][0]);
    80     }
    81   for (i=1;i<=n;i++)
    82     id[i]=i;
    83   if (!init())
    84     {
    85       printf("Infeasible");
    86       return 0;
    87     }
    88   if (!simplex())
    89     {
    90       printf("Unbounded");
    91       return 0;
    92     }
    93   printf("%0.9Lf
    ",-a[0][0]);
    94   for (i=1;i<=m;i++)
    95     ans[id[n+i]]=a[i][0];
    96   if (t)
    97   for (i=1;i<=n;i++)
    98     printf("%0.9Lf ",ans[i]);
    99 }
  • 相关阅读:
    C#中的转义字符verbatim string
    how to use Inspector in fiddler
    how to use composer in fiddler
    CodeWars上的JavaScript技巧积累
    What's the difference between using “let” and “var” to declare a variable in JavaScript?
    Loop through an array in JavaScript
    Why does typeof array with objects return “Object” and not “Array”?
    Owin and Startup class
    Qt Widgets、QML、Qt Quick的区别
    飞舞的蝴蝶(GraphicsView框架)
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8456785.html
Copyright © 2020-2023  润新知