(*
问题描述:
第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员。在众多的飞行员中,每?
幻饧尚性倍伎梢杂肫渌舾擅⒐尚性焙芎玫嘏浜稀H绾窝≡衽涠苑尚械姆尚性辈拍苁挂淮闻沙鲎疃嗟姆苫6杂诟ǖ耐饧尚性庇胗⒐尚性钡呐浜锨榭觯陨杓埔桓鏊惴ㄕ页鲎罴逊尚性迸涠苑桨福够始铱站淮文
芘沙鲎疃嗟姆苫?
编程任务:
对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。
解题思路:
二分图匹配匈牙利算法
*)
Type Pointer=^Node;
Node=Record
v:Longint;
next:Pointer;
end;
Var Map:Array[0..1010] Of Pointer;
n,m:Longint;
Procedure Readin;
Procedure Add_Edge(u,v:Longint);
Var p:Pointer;
Begin
New(p);
p^.v:=v;
p^.next:=Map[u];
Map[u]:=p;
End;
Var u,v:Longint;
Begin
Readln(n,m);
While true do
Begin
Readln(u,v);
If u=-1 then Exit;
Add_Edge(u,v);
Add_Edge(v,u);
End;
End;
Var ans:Longint;
fro:Array[0..1010] Of Longint;
vis:Array[0..1010] Of Boolean;
Procedure Main;
Function Dfs(x:Longint):Boolean;
Var p:Pointer;
Begin
New(p);
p:=Map[x];
While p<>nil do
Begin
If not vis[p^.v] then
Begin
vis[p^.v]:=true;
If (fro[p^.v]=0) or Dfs(fro[p^.v]) then
Begin
fro[p^.v]:=x;
Exit(true);
End;
End;
p:=p^.next;
End;
Exit(false);
End;
Var i:Longint;
Begin
For i:=1 to n do
Begin
Fillchar(vis,sizeof(vis),0);
If Dfs(i) then ans:=ans+1;
End;
End;
Procedure Print;
Var i:Longint;
Begin
Writeln(ans);
For i:=n+1 to m do
If Fro[i]<>0 then writeln(fro[i],' ',i);
End;
Begin
Readin;
Main;
Print;
End.
KCoK6Zeu6aKY5o+P6L+w77yaCuesrOS6jOasoeS4lueVjOWkp+aImOaXtuacn++8jOiLseWbveeah+WutuepuuWGm+S7juaypumZt+WbveW+geWLn+S6huWkp+mHj+WkluexjemjnuihjOWRmOOAgueUseeah+WutuepuuWGm+a0vuWHuueahOavj+S4gOaetumjnuacuumDvemcgOimgemFjeWkh+WcqOiIquihjOaKgOiDveWSjOivreiogOS4iuiDveS6kuebuOmFjeWQiOeahDLlkI3po57ooYzlkZjvvIzlhbbkuK0x5ZCN5piv6Iux5Zu96aOe6KGM5ZGY77yM5Y+mMeWQjeaYr+WkluexjemjnuihjOWRmOOAguWcqOS8l+WkmueahOmjnuihjOWRmOS4re+8jOavjz8K5bm77o266aWn7oaO5bCa5oCn5YCN5LyO5qKi5p2C6IKr5riM7o216Ii+5pOF7o6A4pKQ7oyG5bCa5oCn54SZ6IqO546r5ZiP5rWc56iA77yo57u+56qd4omh6KG95rag6IuR5bCa5qKw5aeG5bCa5oCn6L6I5ouN6IuB5oyC5reu6Ze75rKZ6bKO55aD5Zef5aeG6Iur7ouw77yW5p2C6K+f7omJx5bogJDppafuho7lsJrmgKfluofog5fikpDujIblsJrmgKfpkqHlkZDmtZzplKjmpq3op6/ug6XpmajmnZPln5TmoZPpj4rmg7TjhJXpobXpso7nvbTpgIrlsJrmgKfov7jmtqDoi5Hmoajnpo/ug6XlpJ/lp4vpk7Hnq5nuj53mt67mlocK6IqY5rKZ6bKO55aD5Zef5aeG6Iur7ouwPwoK57yW56iL5Lu75Yqh77yaCuWvueS6jue7meWumueahOWkluexjemjnuihjOWRmOS4juiLseWbvemjnuihjOWRmOeahOmFjeWQiOaDheWGte+8jOe8lueoi+aJvuWHuuS4gOS4quacgOS9s+mjnuihjOWRmOmFjeWvueaWueahiO+8jOS9v+eah+WutuepuuWGm+S4gOasoeiDvea0vuWHuuacgOWkmueahOmjnuacuuOAggoK6Kej6aKY5oCd6Lev77yaCuS6jOWIhuWbvuWMuemFjeWMiOeJmeWIqeeul+azlQoqKQpUeXBlIFBvaW50ZXI9Xk5vZGU7CgpOb2RlPVJlY29yZAoJdjpMb25naW50OwoJbmV4dDpQb2ludGVyOwplbmQ7CgpWYXIgTWFwOkFycmF5WzAuLjEwMTBdIE9mIFBvaW50ZXI7CgluLG06TG9uZ2ludDsKClByb2NlZHVyZSBSZWFkaW47CgoJUHJvY2VkdXJlIEFkZF9FZGdlKHUsdjpMb25naW50KTsKCVZhciBwOlBvaW50ZXI7CglCZWdpbgoJCU5ldyhwKTsKCQlwXi52Oj12OwoJCXBeLm5leHQ6PU1hcFt1XTsKCQlNYXBbdV06PXA7CglFbmQ7CgpWYXIgdSx2OkxvbmdpbnQ7CkJlZ2luCglSZWFkbG4obixtKTsKCVdoaWxlIHRydWUgZG8KCUJlZ2luCgkJUmVhZGxuKHUsdik7CgkJSWYgdT0tMSB0aGVuIEV4aXQ7CgkJQWRkX0VkZ2UodSx2KTsKCQlBZGRfRWRnZSh2LHUpOwoJRW5kOwpFbmQ7CgpWYXIgYW5zOkxvbmdpbnQ7Cglmcm86QXJyYXlbMC4uMTAxMF0gT2YgTG9uZ2ludDsKCXZpczpBcnJheVswLi4xMDEwXSBPZiBCb29sZWFuOwoKUHJvY2VkdXJlIE1haW47CgoJRnVuY3Rpb24gRGZzKHg6TG9uZ2ludCk6Qm9vbGVhbjsKCVZhciBwOlBvaW50ZXI7CglCZWdpbgoJCU5ldyhwKTsKCQlwOj1NYXBbeF07CgkJV2hpbGUgcDw+bmlsIGRvCgkJQmVnaW4KCQkJSWYgbm90IHZpc1twXi52XSB0aGVuCgkJCUJlZ2luCgkJCQl2aXNbcF4udl06PXRydWU7CgkJCQlJZiAoZnJvW3BeLnZdPTApIG9yIERmcyhmcm9bcF4udl0pIHRoZW4KCQkJCUJlZ2luCgkJCQkJZnJvW3BeLnZdOj14OwoJCQkJCUV4aXQodHJ1ZSk7CgkJCQlFbmQ7CgkJCUVuZDsKCQkJcDo9cF4ubmV4dDsKCQlFbmQ7CgkJRXhpdChmYWxzZSk7CglFbmQ7CgpWYXIgaTpMb25naW50OwpCZWdpbgoJRm9yIGk6PTEgdG8gbiBkbwoJQmVnaW4KCQlGaWxsY2hhcih2aXMsc2l6ZW9mKHZpcyksMCk7CgkJSWYgRGZzKGkpIHRoZW4gYW5zOj1hbnMrMTsKCUVuZDsKRW5kOwoKUHJvY2VkdXJlIFByaW50OwpWYXIgaTpMb25naW50OwpCZWdpbgoJV3JpdGVsbihhbnMpOwoJRm9yIGk6PW4rMSB0byBtIGRvCglJZiBGcm9baV08PjAgdGhlbiB3cml0ZWxuKGZyb1tpXSwnICcsaSk7CkVuZDsKCkJlZ2luCglSZWFkaW47CglNYWluOwoJUHJpbnQ7CkVuZC4=