(* 问题描述: 第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的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.