洛谷P4014 分配問題 最小 大費用流

2021-08-15 05:44:07 字數 2121 閱讀 9727

題目描述

有 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...