最大流 模板

2021-08-20 13:49:44 字數 1883 閱讀 1708

題意:問能否構造乙個矩陣,使得矩陣中的每個數字範圍是1-20並且滿足矩陣每行之和與矩陣每列之和與所給陣列相等。

建圖:先來考慮本題的限制是什麼,首先i行與j列 存在著乙個關係 即共用元素k[i][j],如果我們把陣列a[i]b[j]分別看成節點,那麼意味著a[i]可以流向b[j]大小最多為k[i][j]的流量至少為1的流量,注意到,網路流中流量最小為0,所以我們可以先給每個元素減1 同時算出減完後的a』[i]b』[j]求出這個問題下的k』[i][j]之後k[i][j]=k[i][j]』+1即可,我們現在可以給a』[i]連一條通向b』[j]的容量為19的邊,同時建立乙個原點s ,它與每個a』[i]節點連一條邊 容量為a』[i]的值 ,建立乙個匯點t ,每個b』[j]連一條通向t的邊,容量為b』[j]跑一遍最大流,如果匯點t的流量之和為sum(b[j])(j from 1 to m)那麼意味可以構造出來 並且k』[i][j] = a』[i]b』[j]的流量

//主**來自劉汝佳

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 50 + 5;

const

int inf = 1000000000;

struct edge

};struct edmondskarp

void addedge(int from, int to, int cap)

int maxflow(int s, int t)

}if (a[t]) break;

}if (!a[t]) break;

for (int u = t; u != s; u = edges[p[u]].from)

flow += a[t];

}return flow;

}};edmondskarp g;

int no[maxn][maxn];

int a[maxn], b[maxn], str[maxn][maxn];

int main()

int sum_b = 0;

for (int i = 1; i <= c; i++)

for (int i = 1; i <= r; i++)

for (int j = 1; j <= c; j++)

g.maxflow(0, r + c + 1);

for (int i = 1; i <= r; i++)

for (int j = 1; j <= c; j++)

str[i][j] = g.edges[no[i][j]].flow + 1;

for (int i = 1; i <= r; i++)

}if (sum != a[i])

}for (int j = 1; j <= c; j++)

}printf("yes\n");

for (int i = 1; i <= r; i++)

return

0;}

模板 網路最大流 最大流

給出乙個網路圖,以及其源點和匯點,求出其網路最大流。in put role presentation inp utin put4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40ou tput role presentation out puto utpu t50最大...

模板 網路最大流 最大流

給出乙個網路圖,以及其源點和匯點,求出其網路最大流。in put role presentation inp utin put4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40ou tput role presentation out puto utpu t50最大...

最大流模板

2015年1月30日更新 include include include include include include include include include include include include typedef unsigned int uint typedef long lo...