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

2021-08-19 11:28:16 字數 2178 閱讀 8071

傳送門

分配問題就是將人和工作分開來做匹配,但是與一般的二分圖匹配不同的是,每個匹配都是有權值的。這個問題就是二分圖最大權完美匹配問題。

雖然這個問題可以用二分圖最大權完美匹配的專門演算法km演算法解決,但是這裡只講網路流解法。

首先發現人和工作的下標都是1~n的,直接建圖會產生歧義,於是我們可以定義人的下標是1~n,而工作的下標是n + 1~2n。

對於第i

i

個人去做第

j' role="presentation" style="position: relative;">j

j個工作會產生的效益為ci

,jc i,

j(i,

j≤n i,j

≤n

),相當於從

i i

向n+j' role="presentation" style="position: relative;">n+j

n+j連一條容量為1,費用為c的一條邊,最後(也可以在一開始),建立源點

s s

和匯點t' role="presentation" style="position: relative;">tt,從

s s

向下標為1 ~ n的所有結點都連一條容量為1,費用為0的邊,類似地,我們從下標為n + 1 ~ 2n的所有結點都向

t' role="presentation" style="position: relative;">t

t連一條容量為1,費用為0的邊接著從

s s

到t' role="presentation" style="position: relative;">t

t跑一遍最小費用最大流即可,所求得的最小費用就是第一問的答案,對於第二問求最大收益該怎麼解決呢?其實也不難想,重構一遍圖,將容量設為原來容量的相反數,再跑一遍最小費用最大流,將所求的的最小費用取個相反數就是第二問的答案。

#include

#include

#include

#include

#include

#include

#define min(x, y) ((x) < (y) ? (x) : (y))

int a[101][101];

struct graph ;

int n, m, s, t;

std::vector

< edgetype > edge;

std::vector

< bool > inq;

std::vector

< int > head, dist, path;

std::queue

< int > q;

graph()

graph(int n, int m)

void addedge(int from, int to, int cap, int cost) );

head[from] = edge.size() - 1;

edge.push_back((edgetype));

head[to] = edge.size() - 1;

}bool findpath() }}

}return path[t] != -1;

}void argument(long

long& mincost)

}long

long mincostmaxflow(int s, int t)

};graph g;

int main()

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

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

printf("%lld\n", g.mincostmaxflow(0, 2 * n + 1));

g = graph(2 * n + 2, n * n + 2 * n);;

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

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

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

g.addedge(i, n + j, 1, -a[i][j]);

printf("%lld\n", -g.mincostmaxflow(0, 2 * n + 1));

return

0;}

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

題解 網路流24題

網路流 24 題,是網路流部分的十分經典的重要練習。以下根據其知識點和難度分類,各位可以根據自身情況選擇練習。後續將會把題目解析陸續補上。題目鏈結 知識點優先度 p1251 餐巾計畫問題 拆點 費用流 p2754 ctsc1999 家園 星際轉移問題 分層 最大流 費用流 p2756 飛行員配對方案...