Advertisement
Guest User

Untitled

a guest
Sep 19th, 2014
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.15 KB | None | 0 0
  1. program cub;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils,
  7.   Generics.Collections;
  8.  
  9. var
  10.   matching1, matching2: TDictionary<integer, integer>;
  11.   edges               : TList<TList<integer>>;
  12.   vis                 : TList<boolean>;
  13.   ans       : TList<integer>;
  14.   n, i, j, k: integer;
  15.   word      : string;
  16.   letters   : TList<char>;
  17.   cycle, b  : boolean;
  18.  
  19. function kuhn(vertex: integer): boolean;
  20. var
  21.   u: integer;
  22. begin
  23.   for u in edges.Items[vertex] do
  24.   begin
  25.     if (vis.Items[u]) then
  26.       Continue;
  27.     if (not matching1.ContainsKey(u)) then
  28.     begin
  29.       matching1.AddOrSetValue(u, vertex);
  30.       matching2.AddOrSetValue(vertex, u);
  31.       exit(true);
  32.     end else begin
  33.  
  34.       vis.Items[u] := true;
  35.       if (kuhn(matching1.Items[u])) then
  36.       begin
  37.  
  38.         matching1.AddOrSetValue(u, vertex);
  39.         matching2.AddOrSetValue(vertex, u);
  40.         vis.Items[u] := false;
  41.         exit(true);
  42.       end;
  43.  
  44.       vis.Items[u] := false;
  45.     end;
  46.  
  47.   end;
  48.   result := false;
  49. end;
  50.  
  51. begin
  52.   edges     := TList < TList < integer >>.Create;
  53.   matching1 := TDictionary<integer, integer>.Create;
  54.   matching2 := TDictionary<integer, integer>.Create;
  55.   vis       := TList<boolean>.Create;
  56.   letters   := TList<char>.Create;
  57.   reset(input, 'input.txt');
  58.   rewrite(output, 'output.txt');
  59.   readln(n);
  60.   readln(word);
  61.   for i := 1 to length(word) do
  62.     letters.Add(word[i]);
  63.   for i := 1 to n do
  64.     vis.Add(false);
  65.  
  66.   for i := 1 to letters.Count do
  67.     edges.Add(TList<integer>.Create);
  68.  
  69.   for i := 0 to n - 1 do
  70.   begin
  71.     readln(word);
  72.     for j   := 1 to length(word) do
  73.       for k := 0 to letters.Count - 1 do
  74.         if ((word[j] = letters.Items[k]) and (not edges.Items[k].Contains(i))) then
  75.           edges.Items[k].Add(i);
  76.   end;
  77.  
  78.   cycle := true;
  79.   while (cycle) do
  80.   begin
  81.     cycle   := false;
  82.     for i   := 0 to letters.Count - 1 do
  83.       cycle := kuhn(i) or cycle;
  84.     cycle   := cycle and (matching2.Count < letters.Count);
  85.   end;
  86.  
  87.   ans := TList<integer>.Create(matching2.Keys);
  88.  
  89.   ans.Sort;
  90.  
  91.   for i in ans do
  92.     write(Format('%d ', [matching2.Items[i] + 1]));
  93.  
  94. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement