二分図マッチングのハンガリーアルゴリズムと二分図マッチングのいくつかの問題型
1148 ワード
まずハンガリーアルゴリズムを紹介します.
1つの二分図に拡張路(インターリーブ路)がある場合、マッチング数を1回に1つ以上反転させることができる.
ハンガリーのアルゴリズムは、拡張路が求められないまで、すなわち最大マッチングを求めることです.
プログラム実装:
いくつかの重要な応用:
①最小点セットオーバーライド問題:最小点オーバーライド=最大一致
通常、グリッド内の行と列を2つのポイントセットに分割する必要があります.ある行の列にポイントがある場合は、エッジ(エッジとみなされます)を1つ接続し、最大マッチングを行う必要があります.
②最小パスオーバーライド:出度入度を一致させる(2点接続、2点接続)
1つの二分図に拡張路(インターリーブ路)がある場合、マッチング数を1回に1つ以上反転させることができる.
ハンガリーのアルゴリズムは、拡張路が求められないまで、すなわち最大マッチングを求めることです.
プログラム実装:
program hungray;
var map:array[1..500,1..500]of byte;//
r,c,n,k,i,ans:longint;
start:array[1..500]of boolean;// , ,
resul:array[1..500]of longint;// ,
function dfs(x:longint):boolean;//
var i:longint;
begin
for i:=1 to n do
if (map[x,i]=1)and(not start[i]) then
begin
start[i]:=true;// , , 。
if (resul[i]=0)or(dfs(resul[i])) then// , ,
begin
resul[i]:=x;//
dfs:=true;
exit;//
end;
end;
dfs:=false;
end;
begin
read(n,k);
for i:=1 to k do
begin
read(r,c);
map[r,c]:=1;
end;
ans:=0;
for i:=1 to n do// X
begin
fillchar(start,sizeof(start),false);
if dfs(i) then ans:=ans+1;
end;
write(ans);
end.
いくつかの重要な応用:
①最小点セットオーバーライド問題:最小点オーバーライド=最大一致
通常、グリッド内の行と列を2つのポイントセットに分割する必要があります.ある行の列にポイントがある場合は、エッジ(エッジとみなされます)を1つ接続し、最大マッチングを行う必要があります.
②最小パスオーバーライド:出度入度を一致させる(2点接続、2点接続)