網路流24題18 分配問題

2021-07-27 23:42:16 字數 1381 閱讀 4382

有 n 件工作要分配給 n 個人做。第 i 個人做第 j 件工作產生的效益為ci

j 。試設計乙個將n 件工作分配給 n 個人做的分配方案,使產生的總效益最大。

對於給定的 n 件工作和 n 個人,計算最優分配方案和最差分配方案。

第 1 行有 1 個正整數 n,表示有 n 件工作要分配給 n 個人做。接下來的 n 行中,每行有 n 個整數ci

j ,1≤i≤n,1≤j≤n,表示第 i 個人做第 j 件工作產生的效益為ci

j 。

輸出計算出的最小總效益和最大總效益。

二分圖匹配問題。

建立附加源s,附加匯t。

建圖:

1.s向每個人連線一條容量為1,費用為0的邊。

2.每件工作向t連線一條容量為1,費用為0的邊。

3.每個人向每件工作連線一條容量為1,費用為ci

j 。

答案即為最小(大)費用最大流。

#include

#include

#include

using namespace std;

const int n = 1000 + 10, m = 1000000 + 10, inf = 0x3f3f3f3f;

struct edgeedg[m];

int hd[n], nxt[m], tot;

int n, s, t;

int d[n], a[n], p[n], q[n], inq[n];

int mp[n][n];

void insert(int u, int v, int w, int

x)bool spfa1(int &fl, int &cst)}}

}if(d[t] == inf) return false;

fl += a[t];

cst += a[t] * d[t];

int u = t;

while(u != s)

return true;

}bool spfa2(int &fl, int &cst)}}

}if(d[t] == -inf) return false;

fl += a[t];

cst += a[t] * d[t];

int u = t;

while(u != s)

return true;

}void init()

void build()

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

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

insert(i, n + j, inf, mp[i][j]);

}void work()

int main()

網路流24題 11 分配問題

非常經典的模型,就是乙個帶權的二分圖最大匹配,要求滿足最大匹配的同時權值最大,那麼我們顯然想到費用流,a類點向b類點連邊的時候費用設為貢獻就行了,最大貢獻的話spfa跑最長路,最小貢獻spfa跑最短路就行了 include include include include include define...

分配問題 網路流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題 分配問題

時空限制1000ms 256mb 有 n件工作要分配給 n個人做。第 i個人做第 j件工作產生的效益為 c i j 試設計乙個將 n件工作分配給 n個人做的分配方案,使產生的總效益最大。輸入格式 檔案的第 1行有 1 個正整數 n 表示有 n 件工作要分配給 n 個人做。接下來的 n行中,每行有 n...