題意:問能否構造乙個矩陣,使得矩陣中的每個數字範圍是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...