首页 > 其他 > 详细

【UOJ179】线性规划(单纯形)

时间:2017-03-01 12:42:26      阅读:188      评论:0      收藏:0      [点我收藏+]

题意:

技术分享

 

 

思路:单纯形模板

技术分享

技术分享

 

 1 var a:array[0..100,0..100]of double;
 2     idx,idy,q:array[0..100]of longint;
 3     c:array[0..100]of double;
 4     n,m,i,j,op,x,y:longint;
 5     eps,mn:double;
 6 
 7 procedure swap(var x,y:longint);
 8 var t:longint;
 9 begin
10  t:=x; x:=y; y:=t;
11 end;
12 
13 procedure pivot(x,y:longint);
14 var i,j,tot:longint;
15     tmp:double;
16 begin
17  swap(idy[x],idx[y]);
18  tmp:=a[x,y]; a[x,y]:=1/a[x,y];
19  for i:=0 to n do
20   if y<>i then a[x,i]:=a[x,i]/tmp;
21  tot:=0;
22  for i:=0 to n do
23   if (i<>y)and((a[x,i]>eps)or(a[x,i]<-eps)) then
24   begin
25    inc(tot); q[tot]:=i;
26   end;
27  for i:=0 to m do
28  begin
29   if (x=i)or((a[i,y]<eps)and(a[i,y]>-eps)) then continue;
30   for j:=1 to tot do a[i,q[j]]:=a[i,q[j]]-a[x,q[j]]*a[i,y];
31   a[i,y]:=-a[i,y]/tmp;
32  end;
33 end;
34 
35 begin
36  //assign(input,uoj179.in); reset(input);
37  //assign(output,uoj179.out); rewrite(output);
38  readln(n,m,op);
39  randomize;
40  eps:=1e-8;
41  for i:=1 to n do read(a[0,i]);
42  for i:=1 to m do
43  begin
44   for j:=1 to n do read(a[i,j]);
45   read(a[i,0]);
46  end;
47  for i:=1 to n do idx[i]:=i;
48  for i:=1 to m do idy[i]:=i+n;
49  while true do
50  begin
51   x:=0; y:=0;
52   for i:=1 to m do
53    if (a[i,0]<-eps)and((x=0)or(random(2)=1)) then x:=i;
54   if x=0 then break;
55   for i:=1 to n do
56    if (a[x,i]<-eps)and((y=0)or(random(2)=1)) then y:=i;
57   if y=0 then
58   begin
59    writeln(Infeasible);
60   // close(input);
61    //close(output);
62    exit;
63   end;
64   pivot(x,y);
65  end;
66  while true do
67  begin
68   x:=0; y:=0; mn:=1e15;
69   for i:=1 to n do
70    if a[0,i]>eps then begin y:=i; break; end;
71   if y=0 then break;
72   for i:=1 to m do
73    if (a[i,y]>eps)and(a[i,0]/a[i,y]<mn) then
74    begin
75     mn:=a[i,0]/a[i,y]; x:=i;
76    end;
77   if x=0 then
78   begin
79    writeln(Unbounded);
80  //  close(input);
81  //  close(output);
82    exit;
83   end;
84   pivot(x,y);
85  end;
86  writeln(-a[0,0]:0:8);
87  if op=0 then exit;
88  for i:=1 to m do
89   if idy[i]<=n then c[idy[i]]:=a[i,0];
90  for i:=1 to n do
91  begin
92   write(c[i]:0:8);
93   if i<n then write( );
94  end;
95 
96  //close(input);
97  //close(output);
98 end.

 

【UOJ179】线性规划(单纯形)

原文:http://www.cnblogs.com/myx12345/p/6483536.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!