UOJ 179 線性規劃
阿新 • • 發佈:2018-02-21
abs pre 取值 約束 條件 輸入 math 單純 目標
這是一道模板題。
本題中你需要求解一個標準型線性規劃:
有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) 9using 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\n",-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 }
UOJ 179 線性規劃