>
Program Robots;
Const max = 50;
Type Sset = Set of 1 .. max;
Mas = array [1 .. max] of Sset;
Var A, B: Mas;
{A - матриця досяжних, B [i] - які роботи можуть бути в i пункті}
SOne, STwo: SSet; {SOne - роботи, які їдуть зі швидкістю 1, STwo - роботи, які їдуть зі швидкістю 2}
N, M: integer; {N - число пунктів, M - число роботів}
Procedure Init; {ініціалізація вхідних даних}
Var K, i, FrP, ToP: integer;
Begin
FillChar (A, SizeOf (A), 0);
Write ('Кількість пунктів:'); ReadLn (N);
Write ('Кількість доріг:'); ReadLn (K);
For i: = 1 to K do begin
writeLn ('Введіть пункти, які з'єднує дорога № ', i);
ReadLn (FrP, ToP);
Include (A [FrP], ToP);
Include (A [ToP], FrP);
End;
Write ('Кількість роботів:'); ReadLn (M);
For i: = 1 to M do Begin
Write ('Пункт, де знаходиться робот № ', i,': '); ReadLn (K);
Include (B [k], i);
Write ('швидкість робота №', i, ':');
ReadLn (k);
If K = 1 then Include (SOne, i) Else Include (STwo, i);
End;
End;
Function ProvCanMet: Boolean;
Var i: integer;
Begin
i: = 1;
While (I <= N) and (B [i] <> [1 .. M]) do Inc (i);
ProvCanMet: = i <= N;
End;
Function InTwoNear: Boolean;
Var i, j: integer;
Begin
i: = 1; j: = N +1;
while (i N) do begin
j: = i +1;
while (j <= N) and Not ((j in A [i]) and (B [i] + B [j] = [1 .. M])) do Inc (j);
Inc (i);
End;
InTwoNear: = j <= N;
End;
Function AddIfCan (mode: integer; S: Sset): Boolean;
Var i, j: integer;
C: mas;
Begin
AddIfCan: = false; {S - безліч роботів, які їдуть}
If mode = 0 then
For i: = 1 to N do C [i]: = B [i]-S
Else C: = B;
For i: = 1 to N do
For j: = 1 to N do
If (i <> j) and (j in A [i]) and (C [i] * B [j] * S <> B [j] * S) Then Begin
AddIfCan: = true;
C [i]: = C [i] + B [j] * S;
End;
B: = C;
End;
Function InTwoForC: byte;
Var i, j: integer;
Begin
i: = 1; j: = N +1;
while (i N) do begin
j: = i +1;
While (j <= N) and (not (j in A [i]) or (B [i] + B [j] <> [1 .. m]) or Not ((SOne = []) or (STwo = []) or ((B [i] * SOne = SOne) and (B [j] * STwo = STwo)) or (B [j] * SOne = SOne) and (B [i] * STwo = STwo))) do Inc (j);
Inc (i);
End;
If j> N Then InTwoForC: = 0 Else
If STwo = [] Then InTwoForC: = 1 Else
If SOne = [] Then InTwoForC: = 2 Else
InTwoForC: = 3;
End;
Procedure SolveC;
Var ti...