Advertisement
r4lovets

Поиск максимальной клики графа

Dec 26th, 2018
561
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 5.79 KB | None | 0 0
  1. program lab6;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils;
  7.  
  8. const
  9.   N = 5;
  10.  
  11. type
  12.   TArray = array[1..N, 1..N] of Integer;
  13.   TSet = set of 1..N;
  14.   TCliq = array[1..100] of TSet;
  15.  
  16. const
  17.   TestArr: TArray = ((0, 1, 0, 1, 0), (1, 0, 1, 0, 1), (0, 1, 0, 1, 0), (1, 0, 1, 0, 1), (0, 1, 0, 1, 0));
  18.  
  19. ////////////////////////////////////////////////////
  20. //                                                //
  21. //    ВСЁ ЧТО КАСАЕТСЯ ВВОДА МАТРИЦЫ СМЕЖНОСТИ    //
  22. //                                                //
  23. ////////////////////////////////////////////////////
  24.  
  25. procedure InputFromKeyboard(var A: TArray);
  26.  
  27. var
  28.   i, j, x: Integer;
  29.  
  30. begin
  31.   x := 2;
  32.   for i := 1 to N - 1 do
  33.     begin
  34.       for j := x to N do
  35.         begin
  36.           Write('A[', i, '][', j, '] = ');
  37.           Readln(A[i,j]);
  38.           A[j, i] := A[i][j];
  39.         end;
  40.       Inc(x);
  41.     end;
  42.  
  43.   for i := 1 to N do
  44.     A[i][i] := 0;
  45.  
  46.   Writeln;
  47. end;
  48.  
  49. procedure RandomInput(var A: TArray);
  50.  
  51. var
  52.   i, j, k: Integer;
  53.  
  54. begin
  55.   k := 2;
  56.   for i := 1 to N - 1 do
  57.     begin
  58.       for j := k to N do
  59.         begin
  60.           Randomize;
  61.           A[i,j] := Random(2);
  62.           Writeln('A[', i, '][', j, '] = ', A[i,j]);
  63.           A[j, i] := A[i][j];
  64.         end;
  65.       Inc(k);
  66.     end;
  67.  
  68.   for i := 1 to N do
  69.     A[i][i] := 0;
  70.  
  71.   Writeln;
  72. end;
  73.  
  74. procedure Output(A: TArray);
  75.  
  76. var
  77.   i, j: Integer;
  78.  
  79. begin
  80.   for i := 1 to N do
  81.     begin
  82.       for j := 1 to N do
  83.         Write(A[i][j], ' ');
  84.       Writeln;
  85.     end;
  86.   Writeln;
  87. end;
  88.  
  89. procedure SelectingEnthryMethod(var A: TArray);
  90.  
  91. var
  92.   EnthryMethod: Integer;
  93.  
  94. begin
  95.   Writeln('Please select array entry method:'); Writeln;
  96.   Writeln('Enter ''1'' if you prefer random input.');
  97.   Writeln('Enter ''2'' if you prefer input from keyboard.');
  98.   Writeln('Enter ''3'' if you prefer input from constant.'); Writeln;
  99.   Readln(EnthryMethod); Writeln;
  100.  
  101.   case EnthryMethod of
  102.     1: RandomInput(A);
  103.     2: InputFromKeyboard(A);
  104.     3: begin A := TestArr; Writeln; end;
  105.   end;
  106. end;
  107.  
  108. ////////////////////////////////////////////////////
  109. //                                                //
  110. //             ДЕЙСТВИЯ НАД МАССИВАМИ             //
  111. //                                                //
  112. ////////////////////////////////////////////////////
  113.  
  114. function SetUnion(A, B: TSet): TSet;
  115.  
  116. begin
  117.   SetUnion := A + B;
  118. end;
  119.  
  120. function SetIntersection(A, B: TSet): TSet;
  121.  
  122. begin
  123.   SetIntersection := A * B;
  124. end;
  125.  
  126. function SetDifference(A, B: TSet): TSet;
  127.  
  128. begin
  129.   SetDifference := A - B;
  130. end;
  131.  
  132. ////////////////////////////////////////////////////
  133. //                                                //
  134. //     ПРОЦЕДУРЫ ДЛЯ АЛГОРИТМА БРОНА-КЕРБОША      //
  135. //                                                //
  136. ////////////////////////////////////////////////////
  137.  
  138. procedure IsClique(C: TSet; A, B: TSet; var CliqueArray: TCliq);
  139.  
  140. var
  141.   i: Integer;
  142.  
  143. begin
  144.   if (A = []) and (B = []) then
  145.     begin
  146.       i := 1;
  147.       while CliqueArray[i] <> [] do
  148.         Inc(i);
  149.       CliqueArray[i] := C;
  150.     end;
  151. end;
  152.  
  153. function Neighbours(v0: Integer; M: TArray): TSet;
  154.  
  155. var
  156.   A: TSet;
  157.   d: Integer;
  158.  
  159. begin
  160.   A := [];
  161.   for d := 1 to N do
  162.     if M[d, v0] = 1 then
  163.       A := A + [d];
  164.   Neighbours := A;
  165. end;
  166.  
  167. ////////////////////////////////////////////////////
  168. //                                                //
  169. //           АЛГОРИТМ БРОНА-КЕРБОША               //
  170. //                                                //
  171. ////////////////////////////////////////////////////
  172.  
  173. procedure BronKerbosh(R: TSet; P: Tset; X: TSet; M: TArray; var ExternalCliqueArr: TCliq);
  174.  
  175. var
  176.   v: Integer;
  177.  
  178. begin
  179.   IsClique(R, P, X, ExternalCliqueArr);
  180.   for v := 1 to N do if v in P then
  181.     begin
  182.       BronKerbosh(SetUnion(R, [v]), SetIntersection(P, Neighbours(v, M)), SetIntersection(X, Neighbours(v, M)), M, ExternalCliqueArr);
  183.       P := P - [v];
  184.       X := X + [v];
  185.     end;
  186. end;
  187.  
  188. ////////////////////////////////////////////////////
  189. //                                                //
  190. //    Поиск максимальных клики среди найденных    //
  191. //                                                //
  192. ////////////////////////////////////////////////////
  193.  
  194. procedure CliqueOutput(A: TSet);
  195.  
  196. var
  197.   q: Integer;
  198.  
  199. begin
  200.   for q := 1 to N do if q in A then
  201.     Write(q, ' ');
  202.   Writeln;
  203. end;
  204.  
  205. function CliqSize(A: TSet): Integer;
  206.  
  207. var
  208.   i, t: Integer;
  209.  
  210. begin
  211.   t := 0;
  212.   for i := 1 to N do if i in A then
  213.     Inc(t);
  214.   CliqSize := t;
  215. end;
  216.  
  217. function MaxSz(CliqArray: TCliq): Integer;
  218.  
  219. var
  220.   Max, i: Integer;
  221.  
  222. begin
  223.   Max := 0;
  224.   i := 1;
  225.   while (i <= 100) and (CliqArray[i] <> []) do
  226.     begin
  227.       if (CliqSize(CliqArray[i]) > Max) then
  228.         Max := CliqSize(CliqArray[i]);
  229.       Inc(i);
  230.     end;
  231.   MaxSz := Max;
  232. end;
  233.  
  234. procedure MaxCliquesOutput(CliqueArray: TCliq);
  235.  
  236. var
  237.   g: Integer;
  238.  
  239. begin
  240.   for g := 1 to 100 do if CliqSize(CliqueArray[g]) = MaxSz(CliqueArray) then
  241.     CliqueOutput(CliqueArray[g]);
  242. end;
  243.  
  244. ////////////////////////////////////////////////////
  245. //                                                //
  246. //              ОСНОВНАЯ ПРОГРАММА                //
  247. //                                                //
  248. ////////////////////////////////////////////////////
  249.  
  250. var
  251.   Matrix: TArray;
  252.   CompSub, Candidates, NotCandidates: TSet;
  253.   CliqueArray0: TCliq;
  254.   g: Integer;
  255.  
  256. begin
  257.   SelectingEnthryMethod(Matrix);
  258.   Output(Matrix);
  259.  
  260.   CompSub := [];
  261.   NotCandidates := [];
  262.   Candidates := [1..N];
  263.   for g := 1 to 100 do
  264.     CliqueArray0[g] := [];
  265.  
  266.   BronKerbosh(CompSub, Candidates, NotCandidates, Matrix, CliqueArray0);
  267.  
  268.   MaxCliquesOutput(CliqueArray0);
  269.  
  270.   Readln;
  271. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement