fork download
  1. (*
  2. 问题描述:
  3. 第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员。在众多的飞行员中,每?
  4. 幻饧尚性倍伎梢杂肫渌舾擅⒐尚性焙芎玫嘏浜稀H绾窝≡衽涠苑尚械姆尚性辈拍苁挂淮闻沙鲎疃嗟姆苫6杂诟ǖ耐饧尚性庇胗⒐尚性钡呐浜锨榭觯陨杓埔桓鏊惴ㄕ页鲎罴逊尚性迸涠苑桨福够始铱站淮文
  5. 芘沙鲎疃嗟姆苫?
  6.  
  7. 编程任务:
  8. 对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。
  9.  
  10. 解题思路:
  11. 二分图匹配匈牙利算法
  12. *)
  13. Type Pointer=^Node;
  14.  
  15. Node=Record
  16. v:Longint;
  17. next:Pointer;
  18. end;
  19.  
  20. Var Map:Array[0..1010] Of Pointer;
  21. n,m:Longint;
  22.  
  23. Procedure Readin;
  24.  
  25. Procedure Add_Edge(u,v:Longint);
  26. Var p:Pointer;
  27. Begin
  28. New(p);
  29. p^.v:=v;
  30. p^.next:=Map[u];
  31. Map[u]:=p;
  32. End;
  33.  
  34. Var u,v:Longint;
  35. Begin
  36. Readln(n,m);
  37. While true do
  38. Begin
  39. Readln(u,v);
  40. If u=-1 then Exit;
  41. Add_Edge(u,v);
  42. Add_Edge(v,u);
  43. End;
  44. End;
  45.  
  46. Var ans:Longint;
  47. fro:Array[0..1010] Of Longint;
  48. vis:Array[0..1010] Of Boolean;
  49.  
  50. Procedure Main;
  51.  
  52. Function Dfs(x:Longint):Boolean;
  53. Var p:Pointer;
  54. Begin
  55. New(p);
  56. p:=Map[x];
  57. While p<>nil do
  58. Begin
  59. If not vis[p^.v] then
  60. Begin
  61. vis[p^.v]:=true;
  62. If (fro[p^.v]=0) or Dfs(fro[p^.v]) then
  63. Begin
  64. fro[p^.v]:=x;
  65. Exit(true);
  66. End;
  67. End;
  68. p:=p^.next;
  69. End;
  70. Exit(false);
  71. End;
  72.  
  73. Var i:Longint;
  74. Begin
  75. For i:=1 to n do
  76. Begin
  77. Fillchar(vis,sizeof(vis),0);
  78. If Dfs(i) then ans:=ans+1;
  79. End;
  80. End;
  81.  
  82. Procedure Print;
  83. Var i:Longint;
  84. Begin
  85. Writeln(ans);
  86. For i:=n+1 to m do
  87. If Fro[i]<>0 then writeln(fro[i],' ',i);
  88. End;
  89.  
  90. Begin
  91. Readin;
  92. Main;
  93. Print;
  94. End.
Success #stdin #stdout 0s 316KB
stdin
5 10 
1 7 
1 8 
2 6 
2 9 
2 10 
3 7 
3 8 
4 7 
4 8 
5 10 
-1 -1 
stdout
4
1 7
3 8
2 9
5 10