看完《算法导论》肯定会写单纯形
因为单纯形不仅好写而且《算法导论》里讲的很清楚
附赠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 }