給定乙個由 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算了...