已確定了乙個可供選擇的實驗集合e=,和實驗需要使用的全部儀器的集合i=。實驗ej需要用到的儀器是i的子集rjíi。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的任務是找出乙個有效演算法,確定在一次太空飛行中要進行哪些實驗並因此而配置哪些儀器才能使太空飛行的淨收益最大。這裡淨收益是指進行實驗所獲得的全部收入與配置儀器的全部費用的差額。
對於給定的實驗和儀器配置情況,程式設計找出淨收益最大的試驗計畫。
n,m<=50
增設乙個源點s,匯點t,
s向所有實驗連線一條它們所能承受的**的邊作為容量
所有儀器向t連一條它們所需要付出的**的邊作為容量
每個實驗向所需要的儀器連一條無窮大的邊
問題轉化為最大權閉合子圖問題的模型,進而轉化為最小割問題①,
最小割等於最大流,故用網路流解決
需要的儀器跟實驗就是最小割劃分出的s集合中的點,也就是最後能從s訪問到的頂點的集合。
而求最小割的方法是可以從從源點開始走,所有源點能到達的點即為最小割的s集合。
某文章的一段話對①的較為容易理解的解釋:
由於我們要求的是最大收益,這個收益應等於∑c[i](實驗i被選中) - ∑p[j](儀器j被選中)。為保證受益最大,我們應當盡量想讓∑c[i]盡可能大,∑p[j]盡可能小。如果∑c[i]盡可能大,那麼,∑c[k](實驗k未被選中)就應該盡可能小。也就是說,我們應該選擇盡可能小的∑c[k]+ ∑p[j],這樣才能使收益最大。而c[k]、p[j]對應的又是剛剛構造的網路流的連線s、t的弧,而且,一旦刪去了這些弧,整個網路將是不連通的(此點可用反證法證明)。 於是我們可以順其自然的想到最小割。
問題就轉變成了:求乙個網路流中的最小割。
接下來,根據最小割最大流定理,我們就可以代替著求最大流了
鄙人略微理解:
對於這個圖而言,你要盡可能使得你所用的花費少的同時使得這個圖的源點s無法通向匯點t,
若從 s 引出的邊中某一條邊沒有滿流,就說明做這個實驗是可以賺錢的,此時你要割取代價最少的邊總和,使得花費最小,因為到最後,花費轉換一下就可以發現都是由【s–>實驗】的邊承擔
這個時候最小值就是這個圖的最小割,根據最小割等於最大流,可求最大流
然後總收益-最少花費=最大收益
var
a:array [0..101,0..101] of longint;
q:array [0..10001] of longint;
rp:array [0..101] of longint;
v:array [0..101] of boolean;
sum,ans,n,m,s,t:longint;
procedure
init;
var i,j,x:longint;
begin
readln(m,n);
sum:=0;
s:=0;
t:=n+m+1;
for i:=1
to m do
begin
read(x);
sum:=sum+x;
a[s,i]:=x;
while
not(eoln) do
begin
read(x);
a[i,x+m]:=maxlongint div
4; end;
end;
for i:=1
to n do
begin
read(x);
a[i+m,t]:=x;
end;
end;
function
min(aa,bb:longint):longint;
begin
if aa>bb then
exit(bb);
exit(aa);
end;
function
bfs():boolean;
var i,k,head,tail:longint;
begin
fillchar(rp,sizeof(rp),255);
head:=0;
tail:=1;
rp[s]:=0;
q[1]:=s;
while headdo
begin
inc(head);
k:=q[head];
for i:=s to t do
if rp[i]=-1
then
if a[k,i]>0
then
begin
rp[i]:=rp[k]+1;
if i=t then
exit(true);
inc(tail);
q[tail]:=i;
end;
end;
exit(false);
end;
function
dfs(dep,cp:longint):longint;
var i,j,k:longint;
begin
if dep=t then
exit(cp);
k:=0;
for i:=s to t do
if a[dep,i]>0
then
if rp[dep]+1=rp[i] then
begin
j:=dfs(i,min(cp-k,a[dep,i]));
a[dep,i]:=a[dep,i]-j;
a[i,dep]:=a[i,dep]+j;
k:=k+j;
if k=cp then
exit(k);
end;
if k=0
then rp[dep]:=-1;
exit(k);
end;
procedure
dinic;
begin
ans:=0;
while bfs() do
ans:=ans+dfs(s,maxlongint);
end;
procedure
find
(x:longint);
var i:longint;
begin
v[x]:=true;
for i:=s to t do
if a[x,i]>0
then
ifnot(v[i]) then find(i);
end;
procedure
print;
var i,j:longint;
begin
find(s);
for i:=1
to m do
if v[i] then
write(i,' ');
writeln;
for i:=m+1
to m+n do
if v[i] then
write(i-m,' ');
writeln;
writeln(sum-ans);
end;
begin
init;
dinic;
print;
end.
網路流24題 太空飛行計畫問題
網路流24題大多需要spj,所以需要乙個有spj的oj,本系列 均在www.oj.swust.edu.cn測試通過 最大權閉合子圖裸題,先將所有收益加起來,源點向每個方案連線一條收益的流,每個方案向對應需要的儀器連一條inf,每個儀器向匯點連一條花費的流。輸出方案只需要在最後的阻塞流中看還剩哪幾個點...
太空飛行計畫問題 網路流24題
w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e 和進行這些實驗需要使用的全部儀器的集合i 實驗ej需要用到的儀器是i的子集rj i。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的...
網路流24題 太空飛行計畫問題
w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e 和進行這些實驗需要使用的全部儀器的集合i 實驗ej需要用到的儀器是i的子集rj i。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的...