print3. Поиск в глубину

printРазбор задачи 1269. Саванна

Тема: поиск в глубину

Для работы потребуются следующие переменные:
var n, { количество животных }
  d,   { максимальное расстояние между животными одного стада }
  k,   { количество стад }
  i:longint;

  x,y:array[1..1000] of longint; { координаты животных }

  f:array[1..1000] of boolean; { флажки - животное отнесено к какому-то стаду }
Эти переменные инициализируются следующим образом:
read(n,d);
for i:=1 to n do
  begin
    read(x[i],y[i]);
    f[i]:=false;
  end;
k:=0;
Для отнесения животного к какому-то стаду используем рекурсивную подпрограмму:
procedure dfs(i:integer);
var j:integer;
begin
  if f[i] then exit; { уже классифицировали - выходим }
  f[i]:=true; { отмечаем флажком }
  for j:=1 to n do 
    { для всех животных на расстоянии не более D }
    if sqr(x[i]-x[j])+sqr(y[i]-y[j])<=sqr(d) then
      dfs(j); { делаем те же действия }
end;
Теперь для всех непомеченных животных вызываем эту подпрограмму и увеличиваем счетчик стад `k`:
for i:=1 to n do
  if not f[i] then
    begin
      inc(k);
      dfs(i);
    end;
После завершения цикла выводим значение `k`.
loading