題目描述
有 n 件工作要分配給 n 個人做。第 i 個人做第 j 件工作產生的效益為c ij。 試設計乙個將 n 件工作分配給 n 個人做的分配方案,使產生的總效益最大。
輸入格式:
檔案的第 1 行有 1 個正整數 n,表示有 n 件工作要分配給 n 個人做。接下來的 n 行中,每行有 n 個整數c ij,表示第 i 個人做第 j 件工作產生的效益為c ij 。
輸出格式:
兩行分別輸出最小總效益和最大總效益。
說明
1001≤n≤100
題目分析
首先將講講最小收益
超級源點向每個工人連邊
容量為1,費用為0,表示限制每個工人只能有乙個工作
每個工人向每個工作連邊
容量為1,費用為既定收益,這樣當這條邊有流時,費用即為收益
每個工作向超級匯點連邊
容量為1,費用為0,表示限制每個工作只能被做一次
然後跑費用流就可以了
最大收益,即最大費用流
將原圖中的邊的費用全部取反
然後跑費用流,最後費用取反即可
#include
#include
#include
#include
#include
#include
using
namespace std;
intread()
while
(ss>=
'0'&&ss<=
'9')
return f*x;
}const
int inf=
1128481603
;int k,n;
int s,t;
struct nodee[
1000010];
int head[
100010
],tot=1;
int cost[
100010
],cnt;
int dis[
100010
],vis[
100010];
int incf[
100010
],pre[
100010];
int fee;
void
add(
int u,
int v,
int f,
int c)
bool
bfs()}
}return dis[t]
!=inf;
}void
dfs(
) fee+
=dis[t]
*incf[t];}
intmain()
for(
int i=
1;i<=n;i++
)for
(int j=n+
1;j<=n*
2;j++
)while
(bfs()
)dfs()
; cout
memset
(head,0,
sizeof
(head)
);fee=cnt=0;
for(
int i=
1;i<=n;i++
)for
(int i=
1;i<=n;i++
)for
(int j=n+
1;j<=n*
2;j++
)add
(i,j,1,
-cost[
++cnt]),
add(j,i,
0,cost[cnt]);
while
(bfs()
)dfs()
; cout<<
-fee
}
洛谷 P4014 分配問題
有 nn 件工作要分配給 nn 個人做。第 ii 個人做第 jj 件工作產生的效益為 c cij 試設計乙個將 nn 件工作分配給 nn 個人做的分配方案,使產生的總效益最大。輸入格式 檔案的第 11 行有 11 個正整數 nn,表示有 nn 件工作要分配給 nn 個人做。接下來的 nn 行中,每行...
洛谷 P4014 分配問題
題目鏈結 有n件工作要分配給n個人做.第i個人做第j件工作產生的效益為cij 試設計乙個將n件工作分配給n個人做的分配方案,使產生的總效益最大.檔案的第1行有1個正整數n,表示有n件工作要分配給n個人做.接下來的n行中,每行有n個整數cij 表示第i個人做第j件工作產生的效益為cij 兩行分別輸出最...
洛谷P4014 分配問題(費用流)
傳送門 可以把原圖看做乙個二分圖,人在左邊,任務在右邊,求乙個帶權的最大和最小完美匹配 然而我並不會二分圖做法,所以只好直接用費用流套進去,求乙個最小費用最大流和最大費用最大流即可 1 minamoto 2 include3 include4 include5 include6 define inf...