Вирішення задач на графах

ОБХІД У ГЛИБИНУ
Задано неорієнтовний незважений граф, у якому виділено вершину. Вам
потрібно знайти кількість вершин, які лежать з нею у одній компоненті
зв'язності (включаючи саму вершину).
У першому рядку містяться два цілих числа n та s (1 ≤ s ≤ n ≤ 100), де n -
кількість вершин графа, а s - виділена вершина. У наступних n рядках записано по n чисел - матриця суміжності графа, у якій цифра "0" позначає відсутність ребра між вершинами, а цифра "1" - його наявність. Гарантується, що на головній діагоналі матриці завжди стоять нулі.
Виведіть шукану кількість вершин.

Вхідні дані
5 1
0 1 1 0 0
1 0 1 0 0
1 1 0 0 0
0 0 0 0 1
0 0 0 1 0
Вихідні дані
3

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var A:array[1..100,1..100] of byte;
Ch:array[1..100] of byte;
B:array [1..100] of boolean;
i,j,tail,s,n,k:byte;
flag:boolean;
begin
readln(n,s);
for i:=1 to n do
for j:=1 to n do
read(A[i,j]);
tail:=1;
Ch[tail]:=s;
B[s]:=true;
while tail>0 do
begin
flag:=false;
for j:=1 to n do
if (A[Ch[tail],j]=1) and (B[j]=false) then
begin
tail:=tail+1;
Ch[tail]:=j;
B[j]:=true;
flag:=true;
break;
end;
if flag=false then tail:=tail-1;
end;
k:=0;
for i:=1 to n do
if B[i]=true then k:=k+1;
write(k);
readln;
readln;
end.
ОБХІД В ШИРИНУ
Задано неорієновний граф. Знайти відстань від однієї заданої вершини до
іншої.
У першому рядку міститься три натуральних числа n, s та f
(1 ≤ s, f ≤ n ≤ 100) - кількість вершин у графі і номери початкової та кінцевої
вершин відповідно. Далі у n рядках задано матрицю суміжності графа. Якщо
значення у j-му елементі i-го рядка дорівнює 1, то у графі є направлене ребро з вершини i до вершини j.
Вивести мінімальну відстань від початкової вершини до кінцевої. Якщо шляху не існує, виведіть 0.
Вхідні дані
4 4 3
0 1 1 1
1 0 1 0
1 1 0 0
1 0 0 0
Вихідні дані
2

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var A:array[1..100,1..100] of byte;
i,j,n,s,f,head,tail:integer;
B:array[1..100] of boolean;
cher,dist:array[1..100] of integer;
flag:boolean;
begin
read(n,s,f);
for i:=1 to n do
for j:=1 to n do
read(A[i,j]);
head:=1;
tail:=2;
cher[head]:=s;
B[s]:=true;
flag:=false;
dist[head]:=0;
while (head<tail) and (flag=false) do
begin
for j:=1 to n do
begin
if (a[cher[head],j]=1) and (B[j]=false) then
begin
cher[tail]:=j;
B[j]:=true;
dist[tail]:=dist[head]+1;
if j=f then
begin
flag:=true;
break;
end;
tail:=tail+1;
end;
end;
head:=head+1;
end;
if flag=false then write(0) else write(dist[tail]);
readln;
readln;
end.
Сільвейстр Богдан, Паламар Максим, Майданюк Артем
This site was made on Tilda — a website builder that helps to create a website without any code
Create a website