P4013 數字梯形問題 網路流

2022-05-03 14:06:19 字數 3058 閱讀 4274

給定乙個由 nn 行數字組成的數字梯形如下圖所示。

梯形的第一行有 mm 個數字。從梯形的頂部的 mm 個數字開始,在每個數字處可以沿左下或右下方向移動,形成一條從梯形的頂至底的路徑。

分別遵守以下規則:

從梯形的頂至底的 mm 條路徑互不相交;

從梯形的頂至底的 mm 條路徑僅在數字結點處相交;

從梯形的頂至底的 mm 條路徑允許在數字結點相交或邊相交。

輸入格式:

第 11 行中有 22 個正整數 mm 和 nn,分別表示數字梯形的第一行有 mm 個數字,共有 nn 行。接下來的 nn 行是數字梯形中各行的數字。

第 11 行有 mm 個數字,第 22 行有 m+1m+1 個數字,以此類推。

輸出格式:

將按照規則 11,規則 22,和規則 33 計算出的最大數字總和並輸出,每行乙個最大總和。

輸入樣例#1: 複製

2 5

2 33 4 5

9 10 9 1

1 1 10 1 1

1 1 10 12 1 1

輸出樣例#1: 複製

66

7577

首先宣告這是乙個比較簡單的題目,建圖什麼的也很容易想,不過我就出現了很多莫名其妙的bug,浪費了很多時間。

有乙個bug就是我的第乙個out的拆點改成了500然後就錯了,這個我現在還是沒有明白為什麼,但是我覺得呢,這個可能有內部我沒有考慮到的原因,所以以後要寫的規範一點,不要想當然吧。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace

std;

typedef

long

long

ll;const

int inf = 0x3f3f3f3f

;const

int maxn = 2e5+10

;struct

edge

};vector

e;vector

g[maxn];

int a[maxn];//

找增廣路每個點的水流量

int p[maxn];//

每次找增廣路反向記錄路徑

int d[maxn];//

spfa演算法的最短路

int inq[maxn];//

spfa演算法是否在佇列中

ints, t, exa[maxn];

void

init()

void add(int u, int v, int c, int

cost)

bool bellman(int s, int t, int& flow, int &cost)

//bellman 演算法入隊

} }

}//printf("a=%d d=%d\n", a[t], d[t]);

if (d[t] < 0)return

false;//

找不到增廣路

flow += a[t];//

最大流的值,此函式引用flow這個值,最後可以直接求出flow

cost += d[t] * a[t];//

距離乘上到達匯點的流量就是費用

//printf("cost=%lld\n", cost);

for (int u = t; u != s; u = e[p[u]].u)//

逆向存邊

return

true;}

int maxflow(int s, int t, int &cost)

int sum[50],cas=1

;int

n, m;

void

out1()

len++;

}for (int i = 1; i <= m + n - 1; i++) add(sum[m - 1] + i + cas, t, 1, 0

);

int cost = 0

;

int ans =maxflow(s, t, cost);

printf(

"%d\n

", cost);

}void

out2()

len++;

}for (int i = 1; i <= m + n - 1; i++) add(sum[m - 1] + i, t, inf, 0

);

int cost = 0

;

int ans =maxflow(s, t, cost);

printf(

"%d\n

", cost);

return;}

void

out3()

len++;

}for (int i = 1; i <= m + n - 1; i++) add(sum[m - 1] + i, t, inf, 0

);

int cost = 0

;

int ans =maxflow(s, t, cost);

printf(

"%d\n

", cost);

return;}

intmain()

len++;

}sum[

0] = 0

;

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

; out1();

out2();

out3();

return0;

}

洛谷P4013 數字梯形問題(費用流)

傳送門 兩個感受 碼量感人 大佬nb 規則一 m 條路徑都不相交,那麼每乙個點只能經過一次,那麼考慮拆點,把每乙個點拆成 a 和 b 然後兩點之間連一條容量 1 費用該點本身數值的邊,表明這個點只能被選一次,然後每乙個點的 b 向它能到達的點的 a 連邊,表明能從這個點到另乙個點,容量隨意,費用 0...

洛谷P4013數字梯形問題 網路流24題

題目 最大費用最大流裸題 注意 在第二種情況中,底層所有點連向匯點的邊容量應該為inf,因為可以有多條路徑結束在同乙個點。為這個調了半天.如下 include include include include using namespace std queue q intconst maxn 1605...

luogu P4013 數字梯形問題

三倍經驗,三個條件,分別對應了常見的3種模型,第一種是限制每個點只能一次且無交點,我們可以把這個點拆成乙個出點乙個入點,capacity為1,這樣就限制了只選擇一次,第二種是可以有交點,但不能有交邊,那我們就不需要拆點,限制每條capacity都為1就可以了,第三種直接連,沒有限制 includeu...