看完《算法导论》肯定会写单纯形

因为单纯形不仅好写而且《算法导论》里讲的很清楚

附赠uoj179的模板一个

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<stdlib.h>
 7 
 8 using namespace std;
 9 const double eps=1e-9;
10 double a[50][50];
11 int b[50],u[50],n,m,ty;
12 
13 int read()
14 {
15     int x=0,f=1;char ch=getchar();
16     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
17     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
18     return x*f;
19 }
20 int dcmp(double x)
21 {
22     if (fabs(x)<=eps) return 0;
23     if (x>0) return 1; else return -1;
24 }
25 
26 void pivot(int x,int y)
27 {
28      swap(b[x],u[y]);
29      double k=a[x][y]; a[x][y]=1;
30      for (int i=0; i<=n; i++) a[x][i]/=k;
31      for (int i=0; i<=m; i++)
32        if (i!=x&&dcmp(a[i][y])!=0)
33        {
34           k=a[i][y]; a[i][y]=0;
35           a[i][0]+=(i?-1:1)*k*a[x][0];
36           for (int j=1; j<=n; j++)
37             a[i][j]-=k*a[x][j];
38        }
39 }
40 bool initial()
41 {
42      for (int i=1; i<=n; i++) u[i]=i;
43      for (int i=1; i<=m; i++) b[i]=n+i;
44      while (1)
45      {
46            int x=0,y=0;
47            for (int i=1; i<=m; i++)
48              if (dcmp(a[i][0])<0) x=i;
49            if (!x) return 1;
50            for (int i=1; i<=n; i++)
51              if (dcmp(a[x][i])<0) y=i;
52            if (!y) return 0;
53            pivot(x,y);
54      }  
55 }
56                
57 int simplex()
58 {
59     if (!initial()) return 0;
60     while (1)
61     {
62           int x=0,y=0; 
63           for (int i=1; i<=n; i++)
64             if (dcmp(a[0][i])>0) {y=i; break;}
65           if (!y) return 1;
66           double mi=1e15;
67           for (int i=1; i<=m; i++)
68             if (dcmp(a[i][y])>0&&(!x||a[i][0]/a[i][y]<mi)) {mi=a[i][0]/a[i][y];x=i;}
69           if (!x) return -1;
70           pivot(x,y);
71     }  
72 }          
73 int main()
74 {
75     n=read(); m=read(); ty=read(); 
76     for (int i=1; i<=n; i++) a[0][i]=read();
77     for (int i=1; i<=m; i++)
78     {
79         for (int j=1; j<=n; j++) a[i][j]=read(); 
80         a[i][0]=read();
81     }
82     switch (simplex())
83     {
84            case 1:{
85                 printf("%.8lf\n",a[0][0]);
86                 if (ty)
87                 {
88                    for (int i=1; i<=n; i++) u[i]=0;
89                    for (int i=1; i<=m; i++) if (b[i]<=n) u[b[i]]=i;
90                    for (int i=1; i<=n; i++) printf("%.8lf ",u[i]?a[u[i]][0]:double(0));
91                 }
92                 break;
93            }
94            case 0:puts("Infeasible");break;
95            case -1:puts("Unbounded");break;
96     }
97     system("pause");
98     return 0;
99 }
View Code

相关文章:

  • 2022-12-23
  • 2021-07-08
猜你喜欢
  • 2021-08-28
  • 2021-11-28
  • 2022-12-23
  • 2021-06-20
  • 2021-09-07
  • 2021-09-03
相关资源
相似解决方案