設有m個工人x1,x2, …, xm,和n項工作y1,y2, …, yn,規定每個工人至多做一項工作,而每項工作至多分配一名工人去做。由於種種原因,每個工人只能勝任其中的一項或幾項工作。問應怎樣分配才能使盡可能多的工人分配到他勝任的工作。這個問題稱為人員分配問題。
人員分配問題可以用圖的語言來表述。令x=,y=,構造二分圖g=(x, y, e)如下:
對於1≤i≤m,1≤j≤n,當且僅當工人xi勝任工作yi時,g中有一條邊xiyi,於是人員分配問題就成為在g中求乙個最大匹配的問題。
標程:type
node=record
x,y,next:longint;
end;
const
maxn=100;
maxv=3000;
varg:array [1..maxv] of node;
ls,link:array [1..maxn] of longint;
cover:array [1..maxn] of boolean;
n,e,m:longint;
procedure init;
vari,x,y:longint;
begin
readln(m,n);
readln(e);
fori:=1 to e do
begin
with g[i] do
begin
readln(x,y);
next:=ls[x];
ls[x]:=i;
end;
end;
end;
function find(p:longint):boolean;
vart,q:longint;
begin
find:=true;
t:=ls[p];
while t>0 do
with g[t] do
begin
if cover[y]=false then
begin
cover[y]:=true;
q:=link[y];
link[y]:=p;
if (q=0) or find(q) then exit;
link[y]:=q;
end;
t:=next;
end;
find:=false;
end;
procedure main;
vari:longint;
begin
fori:=1 to n do
begin
fillchar(cover,sizeof(cover),0);
find(i);
end;
end;
procedure print;
vari,s:longint;
begin
s:=0;
fori:=1 to n do
iflink[i]<>0 then s:=s+1;
writeln(s);
end;
begin
init;
main;
print;
end.
工作分配問題
問題 設有n件工作分配給n個人,將工作i分配給第j個人所需的菲傭為cij,試設計乙個演算法,為每乙個人分配一件不同的工作,並使總費用達到最小。輸入 第一行有乙個正整數n,接下來n行,每行n個數,表示工作費用。輸入 最小總費用 例子 輸入 3 10 2 3 2 3 4 3 4 5 輸出 9 inclu...
工作分配問題
時間限制 1 sec 記憶體限制 128 mb 提交 10 解決 7 您該題的狀態 已完成 提交 狀態 討論版 設有n件工作分配給n個人,將工作i分配給第j個人費用為cij,為每個人分配一件不同的工作,對於給定的工作費用,計算最佳工作分配方案,使得中費用達到最小。第一行有1個正整數 1 n 20 接...
工作分配問題
problem description 設有n件工作分配給n個人。將工作i分配給第j個人所需的費用為 cij。試設計乙個演算法,為每乙個人都分配1 件不同的工作,並使總費用達到最小。設計乙個演算法,對於給定的工作費用,計算最佳工作分配方案,使總費用達到最小。input 輸入資料的第一行有1 個正整數...