在乙個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...