太空飞行计划
网络流与线性规划24题第二题。
题解中算法很明显,但是有一个地方不完美,就是方案,数据中存在这样的情况,对于一个最优方案,再加上一个实验,总收益不变,数据就把这个实验也算在内了。
所以输出时不是和s相连的点,而是与t不连通的点。
View Code
1 program fly(input,output); 2 const 3 oo = 19950714; 4 var 5 dist : array[0..500] of longint; 6 f : array[0..500,0..500] of longint; 7 q : array[0..2000] of longint; 8 v : array[0..400] of boolean; 9 n,m : longint; 10 w : array[0..200] of longint; 11 cost : array[0..200] of longint; 12 s,t : longint; 13 flow : longint; 14 procedure init; 15 var 16 x,i : longint; 17 begin 18 readln(m,n); 19 s:=0; 20 t:=m+n+2; 21 for i:=1 to m do 22 begin 23 read(w[i]); 24 f[s,i]:=w[i]; 25 f[i,s]:=0; 26 while not eoln do 27 begin 28 read(x); 29 f[i,m+x]:=oo; 30 f[m+x,i]:=0; 31 end; 32 readln; 33 end; 34 for i:=1 to n do 35 begin 36 read(cost[i]); 37 f[m+i,t]:=cost[i]; 38 f[t,m+i]:=0; 39 end; 40 for i:=s to t do 41 f[i,i]:=0; 42 end; { init } 43 procedure swap(var aa,bb :longint ); 44 var 45 tt : longint; 46 begin 47 tt:=aa; 48 aa:=bb; 49 bb:=tt; 50 end; { swap } 51 function bfs(now: longint ):boolean; 52 var 53 head,tail : longint; 54 i : longint; 55 begin 56 head:=0; 57 tail:=1; 58 for i:=s to t do 59 dist[i]:=-1; 60 dist[now]:=0; 61 q[1]:=now; 62 while head<tail do 63 begin 64 inc(head); 65 for i:=s to t do 66 if f[q[head],i]>0 then 67 if dist[i]=-1 then 68 begin 69 dist[i]:=dist[q[head]]+1; 70 inc(tail); 71 q[tail]:=i; 72 end; 73 end; 74 if dist[t]=-1 then 75 exit(false); 76 exit(true); 77 end; { bfs } 78 function min(aa,bb :longint ):longint; 79 begin 80 if aa<bb then 81 exit(aa); 82 exit(bb); 83 end; { min } 84 function dfs(now,minflow: longint ):longint; 85 var 86 i : longint; 87 tmp : longint; 88 begin 89 if now=t then 90 exit(minflow); 91 for i:=s to t do 92 if f[now,i]>0 then 93 if dist[i]=dist[now]+1 then 94 begin 95 tmp:=dfs(i,min(minflow,f[now,i])); 96 if tmp<>0 then 97 begin 98 inc(f[i,now],tmp); 99 dec(f[now,i],tmp); 100 exit(tmp); 101 end; 102 end; 103 exit(0); 104 end; { dfs } 105 procedure main; 106 var 107 tmp,i,j : longint; 108 sum : longint; 109 begin 110 flow:=0; 111 while bfs(s) do 112 begin 113 tmp:=dfs(s,oo); 114 while tmp<>0 do 115 begin 116 inc(flow,tmp); 117 tmp:=dfs(s,oo); 118 end; 119 end; 120 for i:=s to t-1 do 121 for j:=i+1 to t do 122 swap(f[i,j],f[j,i]); 123 bfs(t); 124 fillchar(v,sizeof(v),true); 125 for i:=1 to m do 126 if dist[i]<>-1 then 127 v[i]:=false; 128 for i:=1 to m do 129 if v[i] then 130 write(i,' '); 131 writeln; 132 fillchar(v,sizeof(v),true); 133 for i:=1 to n do 134 if dist[i+m]<>-1 then 135 v[i]:=false; 136 for i:=1 to n do 137 if v[i] then 138 write(i,' '); 139 writeln; 140 sum:=0; 141 for i:=1 to m do 142 inc(sum,w[i]); 143 writeln(sum-flow); 144 end; { main } 145 begin 146 assign(input,'fly.in');reset(input); 147 assign(output,'fly.out');rewrite(output); 148 init; 149 main; 150 close(input); 151 close(output); 152 end.