網路流24題 分配問題

2022-05-15 09:54:57 字數 2002 閱讀 9569

時空限制1000ms / 256mb

有 n件工作要分配給 n個人做。第 i個人做第 j件工作產生的效益為 c[i][j]。試設計乙個將 n件工作分配給 n個人做的分配方案,使產生的總效益最大。

輸入格式:

檔案的第 1行有 1 個正整數 n ,表示有 n 件工作要分配給 n 個人做。

接下來的 n行中,每行有 n個整數 c​​,表示第 i個人做第 j件工作產生的效益為 c[i][j]​。

輸出格式:

兩行分別輸出最小總效益和最大總效益。

輸入樣例: 

5

2 2 2 1 2

2 3 1 2 4

2 0 1 1 1

2 3 4 3 3

3 2 1 2 1

輸出樣例: 

5

14

1≤n≤100

乙個人只能做乙個工作

二分圖多重最優匹配。

感覺就是費用流,只不過知道模型容易建圖了一些。

#include#define n 505

#define inf llong_max/2

using

namespace

std;

typedef

struct

ss;ss edg[n*n];

vector

edges[n];

int now_edges=0

;void addedge(int u,int v,long

long flow,long

long

cost)

; edges[v].push_back(now_edges);

edg[now_edges++]=(ss);

}bool spfa(int s,int t,long

long &flow,long

long &cost)

; vis[s]=1

; queue

q;q.push(s);

int pre[n]=;

long

long maxflow[n]=;

maxflow[s]=inf;

while(!q.empty())

}}

}if(dis[t]==inf)return

false

;

flow+=maxflow[t];

cost+=dis[t]*maxflow[t];

long

long now=t;

while(now!=s)

return

true;}

void mcmf(int s,int t,long

long &flow,long

long &cost)

void

init()

int c[505][505

];int

main()

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

for(int j=1;j<=n;j++)addedge(i,j+n,1

,c[i][j]);

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

long

long flow=0,cost=0

; mcmf(s,t,flow,cost);

printf(

"%lld\n

",cost);

init();

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

for(int j=1;j<=n;j++)addedge(i,j+n,1,-c[i][j]);

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

flow=0

; cost=0

; mcmf(s,t,flow,cost);

printf(

"%lld\n

",-cost);

return0;

}

view code

分配問題 網路流24題

沙雕題,建圖很簡單。跑一遍最小費用,再把邊權取反重跑一遍最小費用。include define rep i,a,b for int i a i b i using namespace std const int n 250 int n,m,s,t,tot int head n struct node...

題解 網路流24題之分配問題

傳送門 分配問題就是將人和工作分開來做匹配,但是與一般的二分圖匹配不同的是,每個匹配都是有權值的。這個問題就是二分圖最大權完美匹配問題。雖然這個問題可以用二分圖最大權完美匹配的專門演算法km演算法解決,但是這裡只講網路流解法。首先發現人和工作的下標都是1 n的,直接建圖會產生歧義,於是我們可以定義人...

網路流24題18 分配問題

有 n 件工作要分配給 n 個人做。第 i 個人做第 j 件工作產生的效益為ci j 試設計乙個將n 件工作分配給 n 個人做的分配方案,使產生的總效益最大。對於給定的 n 件工作和 n 個人,計算最優分配方案和最差分配方案。第 1 行有 1 個正整數 n,表示有 n 件工作要分配給 n 個人做。接...