Поиск в ширину, применяется для решения произвольных задач на графах, требующих соответствующего порядка обхода ("в ширину") графа; раскрашивая пройденные вершины и/или дуги можно управлять порядком и способами обхода (например, однократное или многократное использование дуг и вершин)
Задача Кратчайший маршрут
В стране Б есть N городов, которые соединены M дорогами. По дорогам можно ездить в обоих направлениях. Между двумя городами могут существовать несколько дорог. Мальчик Вася живет в городе с номером 1, и он хочет поехать в город с номером N. Система дорог спроектирована так, что время проезда по каждой дороге одинаковое. Вася просит вас помочь найти кратчайший маршрут из города 1 в город N. Для этого вам необходимо выяснить, какое минимальное количество дорог необходимо проехать, чтобы попасть в желаемый город.
Формат ввода:
N M
X[1] Y[1]
X[2] Y[2]
…
X[M] Y[M]
N – количество городов в стране.
M – количество дорог в стране.
X[i] Y[i] – описание i-ой дороги между городами X и Y.
Ограничения:
2 <= N < = 1000
1 <= M < = 2000
Формат вывода:
Ответ на задачу - минимальное количество дорог, которые необходимо проехать, чтобы попасть в желаемый город.
Пример ввода:
4 4
1 2
2 3
2 4
3 4
Пример вывода:
2
var g:array[1..1000,1..1000] of longint; p,q:array [1..1000] of longint; i,uk,un,n,m,a,b,v:longint;
begin
readln(n,m);
for i:=1 to m do
begin
readln(a,b);
g[a,b]:=g[a,b]+1;
g[b,a]:=g[b,a]+1;
end;
for i:=1 to n do
begin
p[i]:=-1;
g[i,i]:=0;
end;
un:=1;
uk:=2;
p[1]:=0;
q[1]:=1;
while uk<>un do
begin
v:=q[un];
un:=un+1;
for i:=1 to n do
if (g[v,i]>0)and(p[i]=-1) then begin
q[uk]:=i;
uk:=uk+1;
p[i]:=p[v]+1;
end;
end;
writeln(p[n]);
end.Ещё один пример проверки графа на двудольность в ширину.
Банкет
На банкет были приглашены N Очень Важных Персон (ОВП). Были поставлены 2 стола. Столы достаточно большие, чтобы все посетители банкета могли сесть за любой из них. Проблема заключается в том, что некоторые ОВП не ладят друг с другом и не могут сидеть за одним столом. Вас попросили определить, возможно ли всех ОВП рассадить за двумя столами.
Входные данные
В первой строке входного файла INPUT.TXT дано два целых числа: N и M (0 <= N,M <= 100), где N - количество ОВП, а M - количество пар ОВП, которые не могут сидеть за одним столом. В следующих M строках записано по 2 числа - пары ОВП, которые не могут сидеть за одним столом.
Выходные данные
Если способ рассадить ОВП существует, то в выходной файл OUTPUT.TXT выведите YES и NO в противном случае.
Пример
INPUT.TXT
3 2
1 2
1 3
OUTPUT.TXT
YES
__________
Вот основной код
var g:array [1..100,1..100] of longint; p,q:array[1..1000] of longint; un,uk,i,v,n,k,m:longint; f:boolean;
begin
assign(input, 'input.txt'); reset(input);
assign(output, 'output.txt'); rewrite(output);
readln(n,m);
for i:=1 to m do begin
readln(v,k);
g[v,k]:=1;
g[k,v]:=1;
end;
k:=0;
v:=0;
for i:=1 to n do g[i,i]:=0;
un:=1;
uk:=2;
q[1]:=1;
p[1]:=1;
f:=true;
while (un<>uk)and(f) do begin
v:=q[un];
un:=un+1;
for i:=1 to n do
if g[v,i]=1
then if p[i]=p[v]
then f:=false
else if p[i]=0 then begin
q[uk]:=i;
uk:=uk+1;
p[i]:=3-p[v];
end;
end;
if f=true then writeln('YES')
else writeln('NO');
end.Отредактировано Санчоус (2011-10-16 16:36:08)

