網路流24題16 數字梯形問題

2021-07-27 23:28:04 字數 2362 閱讀 6935

給定乙個由 n 行數字組成的數字梯形如下圖所示。梯形的第一行有 m 個數字。從梯形的頂部的 m 個數字開始,在每個數字處可以沿左下或右下方向移動,形成一條從梯形的頂至底的路徑。

規則 1:從梯形的頂至底的 m條路徑互不相交。

規則 2:從梯形的頂至底的 m條路徑僅在數字結點處相交。

規則 3:從梯形的頂至底的 m條路徑允許在數字結點相交或邊相交。

對於給定的數字梯形,分別按照規則 1,規則 2,和規則 3 計算出從梯形的頂至底的 m 條路徑,使這 m條路徑經過的數字總和最大。

第 1 行中有 2 個正整數 m和 n(m,n<=20),分別表示數字梯形的第一行有 m 個數字,共有 n 行。接下來的 n 行是數字梯形中各行的數字。第 1 行有 m個數字,第 2 行有 m+1 個數字,…。

輸出按照規則 1,規則 2,和規則 3 計算出的最大數字總和。

每行乙個最大總和。

2 5

2 3

3 4 5

9 10 9 1

1 1 10 1 1

1 1 10 12 1 1

66 75

77規則(1)

把梯形中每個位置抽象為兩個點

a>

, b>

,建立附加源s匯t。

1、對於每個點i從

a>

到b>

連線一條容量為1,費用為點i權值的有向邊。

2、從s向梯形頂層每個

a>

連一條容量為1,費用為0的有向邊。

3、從梯形底層每個

b>

向t連一條容量為1,費用為0的有向邊。

4、對於每個點i和下面的兩個點j,分別連一條從

b>

到a>

容量為1,費用為0的有向邊。

求最大費用最大流,費用流值就是結果。

規則(2)

把梯形中每個位置看做乙個點i,建立附加源s匯t。

1、從s向梯形頂層每個i連一條容量為1,費用為0的有向邊。

2、從梯形底層每個i向t連一條容量為無窮大,費用為i的權值的有向邊。

3、對於每個點i和下面的兩個點j,分別連一條從i到j容量為1,費用為點i權值的有向邊。

求最大費用最大流,費用流值就是結果。

規則(3)

把梯形中每個位置看做乙個點i,建立附加源s匯t。

1、從s向梯形頂層每個i連一條容量為1,費用為0的有向邊。

2、從梯形底層每個i向t連一條容量為無窮大,費用為i的權值的有向邊。

3、對於每個點i和下面的兩個點j,分別連一條從i到j容量為無窮大,費用為點i權值的有向邊。

求最大費用最大流,費用流值就是結果。

#include
#include

#include

#include

using namespace std;

const int n = 1000 * 2 + 10, m = 1000000 + 10, inf = 0x3f3f3f3f;

struct edgeedg[m];

int hd[n], nxt[m], tot;

ints, t;

intq[n], inq[n], d[n], p[n], a[n];

int n, m, mp[50][50];

void insert(int u, int v, int w, int

x)bool spfa(int &fl, int &cst)}}

}if(d[t] == -inf) return false;

fl += a[t];

cst += a[t] * d[t];

int u = t;

while(u != s)

return true;

}int maxflow()

void init()

int get(int i, int j)

void work1()

}for(int i = 1; i <= m; i++)

insert(s, i, 1, 0);

for(int i = 1; i <= n + m -1; i++)

insert(num + get(n, i), t, 1, 0);

printf("%d\n", maxflow());

}void work2()

printf("%d\n", maxflow());

}void work3()

printf("%d\n", maxflow());

}int main()

網路流24題 16 數字梯形問題

問題描述 給定乙個由 n 行數字組成的數字梯形如下圖所示。梯形的第一行有 m 個數字。從梯形的頂部的 m 個數字開始,在每個數字處可以沿左下或右下方向移動,形成一條從梯形的頂至底的路徑。規則1 從梯形的頂至底的m條路徑互不相交。規則2 從梯形的頂至底的m條路徑僅在數字結點處相交。規則3 從梯形的頂至...

網路流24題 數字梯形問題

網路流24題大多需要spj,所以需要乙個有spj的oj,本系列 均在www.oj.swust.edu.cn測試通過 這絕對是我見過最不要臉的網路流了,一道題竟然赤裸裸的讓你建三個圖,算了,還是耐著性子把它做完了。我們首先要想明白的問題就是如果兩條路徑沒有任何公共點,那麼這兩條路徑一定不會相交,因為這...

網路流24題 數字梯形問題

題面 傳送門思路 三合一題目 但是實際上做好了第乙個就沒有別的問題了 第一問 把每個數字拆成兩個點,中間連一條容量為1,費用為0的邊,以此達到限制每個點流量的目的 然後其餘的不多說,源點到第一層,每一層向下連,最後一層到匯點 第二問 第一問中每個點內部的那條邊容量改成inf就好 第三問 直接dp算了...