有m個工人x1, x2, …, xm,和n項工作y1, y2, …, yn,規定每個工人至多做一項工作,而每項工作至多分配一名工人去做。由於種種原因,每個工人只能勝任其中的一項或幾項工作。問應怎樣分配才能使盡可能多的工人分配到他勝任的工作。總共有s組x,y表示工人x能勝任工作y。
求最多能讓多少個工人派到自己的勝任的工作上。
這個問題稱為人員分配問題。
1<=m,n<=100
1<=s<=10000
這題是匈牙利演算法的模板題,
匈牙利演算法是一種利用不斷的去尋找增廣路增廣直到不存在增廣路時得到最大匹配的一種演算法
這個部落格的講解很詳細。
當然匈牙利的時間複雜度偏高,所以一般用於解決資料偏小的最大匹配問題。
const
maxn=100;
var map:array [0..maxn+1,0..maxn+1] of boolean;
cover:array [0..maxn+1] of boolean;
link:array [0..maxn+1] of longint;
ans,s,i,j,x,y,n,m:longint;
function
find
(x:longint):boolean;
var q,i:longint;
begin
q:=0;
for i:=1
to n do
if map[x,i] and
not(cover[i]) then
begin
q:=link[i];
link[i]:=x;
cover[i]:=true;
if (q=0) or find(q) then
exit(true);
link[i]:=q;
end;
exit(false);
end;
begin
readln(n,m);
readln(s);
for i:=1
to s do
begin
readln(x,y);
map[x,y]:=true;
end;
for i:=1
to n do
begin
fillchar(cover,sizeof(cover),false);
find(i);
end;
ans:=0;
for i:=1
to n do
if link[i]>0
then inc(ans);
writeln(ans);
end.
SSL 1338 最大匹配 人員分配
題意 description 設有m個工人x1,x2,xm,和n項工作y1,y2,yn,規定每個工人至多做一項工作,而每項工作至多分配一名工人去做。由於種種原因,每個工人只能勝任其中的一項或幾項工作。問應怎樣分配才能使盡可能多的工人分配到他勝任的工作。這個問題稱為人員分配問題。讀入 input 第一...
最大匹配 人員分配
題目大意 設有m個工人x1,x2,xm,和n項工作y1,y2,yn,規定每個工人至多做一項工作,而每項工作至多分配一名工人去做。由於種種原因,每個工人只能勝任其中的一項或幾項工作。問應怎樣分配才能使盡可能多的工人分配到他勝任的工作。分析 對於1 i m,1 j n,當且僅當工人xi勝任工作yi時,g...
匈牙利 最大匹配 人員分配
description 設有m個工人x1,x2,xm,和n項工作y1,y2,yn,規定每個工人至多做一項工作,而每項工作至多分配一名工人去做。由於種種原因,每個工人只能勝任其中的一項或幾項工作。問應怎樣分配才能使盡可能多的工人分配到他勝任的工作。這個問題稱為人員分配問題。input 第一行兩個整數m...