題目描述
給定乙個由 n n
n 行數字組成的數字梯形如下圖所示。梯形的第一行有 m m
m 個數字。
從梯形的頂部的 m m
m 個數字開始,在每個數字處可以沿左下或右下方向移動,形成一條從梯形的頂至底的路徑。
分別遵守以下規則:
從梯形的頂至底的 m m
m 條路徑互不相交;
從梯形的頂至底的 m m
m 條路徑僅在數字結點處相交;
從梯形的頂至底的 m m
m 條路徑允許在數字結點相交或邊相交。
輸入格式
第 1 1
1 行中有 2 2
2 個正整數 m m
m 和 n n
n,分別表示數字梯形的第一行有 m m
m 個數字,共有 n n
n 行。
接下來的 n n
n 行是數字梯形中各行的數字。
第 1 1
1 行有 m m
m 個數字,第 2 2
2 行有 m+1 m + 1m+
1 個數字 ……
輸出格式
將按照規則 1,規則 2,和規則 3 計算出的最大數字總和並輸出,每行乙個最大總和。
樣例樣例輸入
2 5
2 33 4 5
9 10 9 1
1 1 10 1 1
1 1 10 12 1 1
樣例輸出
66
7577
資料範圍與提示
1≤m,n≤20 1 \leq m, n \leq 201≤
m,n≤
20根據題目描述建圖:
第一問:
將每個點拆成出點和入點,入點和出點連邊容量為1,保證每個點不重複,每個出點和左下角點以及右下角點連一容量為1
費用為目標點權值的邊,保證了邊不重複。源點與第一行所有點的入點連一條容量為1費用為目標點權值的邊。為保證有且
只有m條路徑,我的方法先讓最後一行每個點與匯點1建邊,容量為1費用為0,再讓匯點1和最終匯點建一容量為m費用為0的邊。
這樣可以保證最終會產生m條路徑。
第二問:
與第一問類似,但是允許重複利用同一節點,那麼只要把每個節點的入點和出點之間的邊的容量修改為inf就好了,其他同上。
第三問:
在第二問的基礎上,把不同點之間所連邊的容量改為inf即可。
三次詢問分別求出最小費用最大流。
#include#include#include#includeusing namespace std;
const int maxm = 10005;
const int maxn = 100005;
const int inf = 1e9 + 7;
struct node
edge[maxn];
int dis[maxm], head[maxm], cur[maxm], pre[maxn], f[1005][1005], map[1005][1005];
int s, t, n, m, cnt;
void init()
void add(int u, int v, int w, int cost)
int bfs()
} }if (dis[t] == inf) return 0;
return 1;
}int mcmf()
ans += minflow*dis[t];
} return ans;
}int main()
} for (i = 1;i <= n;i++)
}} add(id * 2 + 1, t, m, 0);
printf("%d\n", -mcmf());
init();
for (i = 1;i <= n;i++)
}} add(id * 2 + 1, t, m, 0);
printf("%d\n", -mcmf());
init();
for (i = 1;i <= n;i++)
}} add(id * 2 + 1, t, m, 0);
printf("%d\n", -mcmf());
return 0;
}
網路流24題 數字梯形問題
網路流24題大多需要spj,所以需要乙個有spj的oj,本系列 均在www.oj.swust.edu.cn測試通過 這絕對是我見過最不要臉的網路流了,一道題竟然赤裸裸的讓你建三個圖,算了,還是耐著性子把它做完了。我們首先要想明白的問題就是如果兩條路徑沒有任何公共點,那麼這兩條路徑一定不會相交,因為這...
網路流24題 數字梯形問題
題面 傳送門思路 三合一題目 但是實際上做好了第乙個就沒有別的問題了 第一問 把每個數字拆成兩個點,中間連一條容量為1,費用為0的邊,以此達到限制每個點流量的目的 然後其餘的不多說,源點到第一層,每一層向下連,最後一層到匯點 第二問 第一問中每個點內部的那條邊容量改成inf就好 第三問 直接dp算了...
網路流24題 數字梯形問題 費用流
洛谷傳送門 loj傳送門 勞資把 spfa 裡 cost 陣列初始化從 1 改成 inf 就特麼 a 了,梯形裡有負數,浪費了半個多小時,心態都崩了 問題難度好像是反過來的 源點向第一排的點都流量為 1 費用為 0 的邊,最後一排的點向匯點連流量為 1 費用為 0 的邊 第三問點點之間流量 inf ...