Isap 最大收益問題

2021-10-02 10:16:51 字數 1718 閱讀 9271

永樂理工大學的實驗室計畫了一系列實驗專案,這些實驗專案需要不同的實驗儀器,而配置儀器需要費用,但實驗也會產生經濟效益。請設計乙個演算法,如何才能有最大淨收益?

模型歸納為二分圖匹配模型,假設實驗專案為e = ,儀器為,那麼假設配置儀器的費用使用ci表示,經濟收益用pi表示,那麼,我們利用二分圖實現該問題,首先源點與匯點需要增加這兩個點,從源點到實驗專案ei的邊的容量為經濟效益,而從實驗儀器到匯點的容量為費用,並且實驗專案到該實現專案所需的實驗儀器的連線容量設定為無窮大,那麼如下公式所示:

其中集合s是選中的實驗以及用到的儀器,集合t為未選中的儀器即實驗

2. 其中ck為我們使用的儀器的費用,pi是實驗的費用,如下例:

假設選取e1,e2,e3三個實驗,並且需要儀器u1,u2,u3那麼計算式子就是總收益 = p1 + p2 + p3 + p4 ,

未選中的實驗收益p4,儀器費用c1 + c2 + c3,那麼總收益需要減去 p4 + c1+ c2 + c3,那麼這幾項之和正好是該網路的割線,那麼只需要求解最小割流量即可,而在離散數學中可知,最大流等於最小割,那麼我們只需要求解該網路的最大流量即可求解。

計算表示式 = 所有實驗的收益 - 最大流量值;

構建網路,從源點到實驗專案ei的邊的容量為經濟效益,而從實驗儀器到匯點的容量為費用,實驗與儀器之間的連線設定為無窮大。

求解最大網路流,isap演算法即可解決

輸出方案即可 加邊

void

add(

int u,

int v,

int num)

void

add_edge

(int u,

int v,

int num)

高度設定

void

set_height

(int start,

int total)}}

cout <<

"初始化高度是:"

<< endl;

cout <<

"_floor[ ] = "

;for

(int i =

1; i <= total; i++

) cout <<

" "

<< _floor[i]

; cout << endl;

return

;}

isap演算法實現

int

isap

(int start,

int total,

int point_total)

cout <<

"增流:"

<< d << endl;

ans +

= d;

d = inf;

}break;}

}if(v ==-1

)}return ans;

}

方案搜尋

void

dfs(

int u)}}

return

;}

最大收益問題

time limit 2000ms memory limit 65536k 有疑問?點這裡 鐵牌狗最近迷上了一款遊戲,但鐵牌狗實在是太笨了,他還是要請求你的幫助。有乙個n行m 列的矩陣 a,矩陣 a中每個數字均為正整數,現在鐵牌狗要在其中選出乙個r行 c列的子矩陣 b,這個子矩陣 b中各個數字之和即...

最大流 ISAP 模板

isap演算法還不懂的戳這裡 最大流入門題傳送門 poj 1273 drainage ditches 下面是isap 當前弧優化 gap優化的 include include include define clear a,x memset a,x,sizeof a define copy a,b m...

做專案的最大收益問題

給定兩個整數w和k,w代表你擁有的初始資金,k代表你最多可以做k個專案。再給定兩個長度為n的正數陣列costs和profits,代表一共有n個專案,costs i 和profits i 分別表示第i號專案的啟動資金與做完後的利潤 注意是利潤,如果乙個專案的啟動資金為10,利潤為4,代表該專案最終的收...