網路流 費用流 ACWING382

2021-09-25 21:13:05 字數 1419 閱讀 2832

在乙個n*n的矩形網格中,每個格仔裡都寫著乙個非負整數。

可以從左上角到右下角安排k條路線,每一步只能往下或往右,沿途經過的格仔中的整數會被取走。

若多條路線重複經過乙個格仔,只取一次。

求能取得的整數的和最大是多少。

輸入格式

第一行包含兩個整數n和k。

接下來n行,每行包含n個不超過1000的整數,用來描述整個矩形網格。

輸出格式

輸出乙個整數,表示能取得的最大和。

資料範圍

1≤n≤50,

0≤k≤10

輸入樣例:

3 21 2 3

0 2 1

1 4 2

輸出樣例:

15解題思路:

首先我們可以將乙個點拆分成2個點,乙個出點,乙個為入點,出點與入點之間連線2條邊,一條邊的容量為1,花費為c, 零一條邊的容量為k - 1, 花費為0, 然後在能夠到達的點之間連線一條邊,容量為k, 花費為0, 這樣我們就建立了一張由初始點為源點,終點為匯點的圖,然後他們容量的總和為k,因為有花費的邊的容量為1, 所以滿足了題目中需要走k條路經的需求,在保證了最大流的前提下我們再去用spfa去跑最長路,把每次得到的結果加起來最終就得到了最後的答案。

注意點:

1.陣列範圍要開夠

2.定義邊的序號的時候可以由一點技巧,具體看**

3.出隊一定要記得 q.pop()。!!!

ac**:

#include #include #include #include using namespace std;

const int n = 5005, m = 3e4 + 5;

const int inf = 0xcfcfcfcf;

int n, k, s, t, ans, maxflow;

int h[n], e[m], w[m], c[m], ne[m], idx;

int d[n], incf[n], pre[n];

bool vis[n];

inline int num(int i, int j, int k)

inline void add(int a, int b, int we, int co)

inline bool spfa(void)

}} }

if(d[t] == 0xcfcfcfcf) return false;

return true;

}inline void update(void)

maxflow += incf[t];

ans += d[t] * incf[t];

}int main(void) }

while(spfa()) update();

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

return 0;

}

網路流 費用流

這個好像不考 沒事可以騙分 費用流,顧名思義,就是有費用的流,也就是說,給乙個網路流圖中的每條弧增加乙個單位流量費用。一般來說求解的費用流都是最大流最小費用。好像沒什麼好bb的 這裡推薦使用zkw演算法求解最小費用流,看著 理解就行,應該還是很好理解的。zkw演算法在稠密圖上跑得飛快,在稀疏圖上還不...

網路流 費用流

網路流有很多種類 其中最大流 有增廣路演算法和預流推進演算法。增廣路演算法就是不斷的新增增廣路。其中的dinic演算法。會稍微提到isap演算法 poj1273 首先想到dfs一直往後延伸,然後從源點到匯點計算每條路,但是這樣只是單條路的最值,有時可能因為走一條路而間接的認定了除這條路以外的某個路通...

網路流之費用流

求費用流目前好像只有ek spfa改版,時間複雜度為o n e k 其中k為最大流值。但時間上的期望時間複雜度為 o a e k 其中a為所有頂點進佇列的平均次數,可以證明a一般小於等於2。最小費用最大流 include using namespace std const int inf 0x3f3...