匹配(工作分配問題)

2021-07-13 14:47:58 字數 1584 閱讀 6754

設有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 個正整數...