Дистанционные семинары




Скачать 0.69 Mb.
страница 4/7
Дата 31.08.2016
Размер 0.69 Mb.
1   2   3   4   5   6   7

Формат входных данных
Входной файл содержит пять чисел: N,x1,y1,x2,y2(5 <= N <= 20, 1 <= x1,y1,x2,y2 <= N). Левая верхняя клетка доски имеет координаты (1,1), правая нижняя - (N,N).

Формат выходных данных
Первая строка выходного файла должна содержать единственное число K - наименьшее необходимое число ходов коня. В каждой из следующих K+1 строк должно быть записано 2 числа - координаты очередной клетки в пути коня.

Пример

input.txt

output.txt

5

1 1


3 1

2

1 1


2 3

3 1


Пусть клетки шахматной доски будут вершинами графа. Ребрами соединим такие пары вершин, что конь может попасть из одной в другую за один ход. В этом графе по условию необходимо найти кратчайший путь между двумя заданными вершинами. Это можно сделать с помощью поиска в ширину.

Матрица смежности полученного графа будет очень большой. Заметим, что для любой вершины мы можем без труда найти всех ее соседей. Представим себе, что шахматная доска бесконечна во все стороны. Тогда для любой клетки (x,y) существует ровно восемь соседей: (x+2,y+1), (x+2,y-1), (x+1,y+2), (x+1,y-2), (x-1,y+2), (x-1,y-2), (x-2,y+1), (x-2,y+1). Нашу конечную шахматную доску можно представить как часть бесконечной, и при вычислении соседей просто проверять, попадает ли клетка в рамки нашей доски или нет.

Мысленно сотрем из записи координат соседей данной клетки x и y. Получим: (+2,+1), (+2,-1), (+1,+2), (+1,-2), (-1,+2), (-1,-2), (-2,+1), (-2,-1). Эти числа показывают смещения координат клеток, соответствующих соседним вершинам, относительно координат клетки, соседей которой нам необходимо найти. Если записать эти смещения в два массива: первый - смещение по x, второй - соответсвующее ему смещение по y, то перебор всех соседей клетки сведется к циклу от 1 до 8:

const
  dx: array [1..8] of integer = (2, 2, 1, 1,-1,-1,-2,-2);
  dy: array [1..8] of integer = (1,-1, 2,-2, 2,-2, 1,-1);
  {...}
  for i := 1 to 8 do
  begin
    newx:=x+dx[i];
    newy:=y+dy[i];
    {...}
  end

Таким образом, в этой задаче граф вообще не нужно хранить в памяти компьютера. Заметим, что обход этого графа в ширину будет занимать порядка N*N действий, т.е. пропорционально количеству вершин в нем. Дело в том, что на каждом шаге мы рассматриваем не все вершины, а только соседей, которых не более 8.

Задача 05-3. Табличка


Имя входного файла

input.txt

Имя выходного файла

output.txt

Максимальное время работы на одном тесте:

3 секунды

Дана таблица, состоящая из N строк и M столбцов. В каждой клетке таблицы записано одно из чисел:0 или 1. Расстоянием между клетками (x1,y1) и (x2,y2) назовем сумму |x1-x2|+|y1-y2|. Вам необходимо построить таблицу, в клетке (i,j) которой будет записано минимальное расстояние между клеткой (i,j) начальной таблицы и клеткой, в которой записана 1. Гарантируется, что хотя бы одна 1 в таблице есть.

Формат входных данных
В первой строке входного файла содержатся два натуральных числа N и M, не превосходящих 100. Далее идут N строк по M чисел - элементы таблицы.

Формат выходных данных
Выходной файл должен содержать N строк по M чисел - элементы искомой таблицы.

Пример

input.txt

output.txt

2 3

0 0 1


1 0 0

1 1 0

0 1 1


Пусть клетки таблицы будут вершинами графа. Ребрами соединим клетки, имеющие общую сторону. Нетрудно убедиться, что расстояние между клетками таблицы равно расстоянию между соответсвующими им вершинами в графе. Обойдем граф в ширину, в начале добавив в очередь все вершины, соответствующие клеткам, содержащим 1. Полученные расстояния и будут ответом на поставленную задачу.

Как и в предыдущей задаче, граф не нужно хранить в памяти компьютера



Задача 05-4. Два коня

Имя входного файла

input.txt

Имя выходного файла

output.txt

Максимальное время работы на одном тесте:

3 секунды

На стандартной шахматной доске(8х8) живут 2 шахматных коня:Красный и Зеленый. Обычно они беззаботно скачут по просторам доски, пощипывая шахматную травку, но сегодня особенный день: у Зеленого коня День Рождения. Зеленый конь решил отпраздновать это событие вместе с Красным. Но для осуществления этого прекрасного плана им нужно оказаться на одной клетке. Заметим, что Красный и Зеленый шахматные кони сильно отличаются от черного с белым: они ходят не по очереди, а одновременно, и если оказываются на одной клетке, никто никого не съедает. Сколько ходов им потребуется, чтобы насладиться праздником?

Формат входных данных
Во входном файле содержатся координаты коней, записанные по стандартным шахматным правилам (т.е. двумя символами - маленькая латинская буква (от a до h) и цифра (от 1 до 8), задающие столбец и строку соответсвенно).

Формат выходных данных
Выходной файл должен содержать наименьшее необходимое количество ходов, либо -1, если кони не могут встретиться.

Пример

input.txt

output.txt

a1 a3

1

Постороим граф, вершиной в котором будет пара клеток доски, задающая положение коней. Ребром соединим вершины, в которые можно попасть за один ход Красного и Зеленого коня. Чтобы найти ответ к задаче, нужно найти в графе кратчайшее расстояние от вершины, соответствующей начальному положению коней на доске до любой из вершин, задающих две одинаковые клетки доски. Будем решать эту задачу поиском в ширину. Заметим, что вершину графа можно задавать одним числом A*1000+B*100+C*10+D, где A и B будут координатами первого коня на доске,а C и D - второго. Как и в предыдущих задачах, сам граф с ребрами хранить не надо. Поиск соседей вершины осуществляется аналогично задаче 2, только здесь нужно будет смещать положение обоих коней одновременно. Как только мы нашли вершину, первые две цифры которой совпадают со вторыми двумя, поиск закончен, ответом будет номер шага, на котором получена эта вершина
Занятие 6. Графы. Поиск кратчайшего пути. Алгоритм Дейкстры.
Пусть дан взвешенный граф с N вершинами и M ребрами. Требуется найти кратчайшие расстояния от данной вершины до всех остальных. Эта задача может быть решена с помощью алгоритма Дейкстры.

Заметим, что алгоритм Дейкстры работает только в графах, веса ребер которых неотрицательны.

Обозначим начальную вершину X.

Проследим за ходом работы этого алгоритма. В каждый момент времени у нас будут 3 множества вершин:
  1) те вершины, до которых мы нашли кратчайшее расстояние
  2) вершины, до которых мы знаем текущее кратчайшее расстояние, за которое мы до этой вершины можем дойти, но еще не знаем, является ли оно минимальным в целом.
  3) вершины, ни одного пути до которых (и ни одного расстояния соответственно) нам не известно.

В начале работы алгоритма первое множество состоит из единственной вершины - начальной, до которой мы знаем расстояние (оно равно нулю); второе множество состоит из соседей начальной вершины, а третье включает в себя все остальные вершины.

На каждом шаге мы будем совершать следующие действия:


  • Найдем минимум из расстояний от начальной вершины до вершин из второго множества и запомним вершину второго множества, на которой этот минимум достигается (обозначим ее Р)

  • Перенесем вершину Р из второго множества в первое

  • Переберем всех соседей вершины Р. Обозначим текущего соседа, с которым мы работаем, U. Заметим, что в данный момент мы нашли путь из вершины Х в вершину U: это путь из вершины Х в вершину Р, дополненный ребром (Р,U).

    1. Если U лежит в третьем множестве, то мы должны перенести вершину U во второе множество, а расстояние до него посчитать как длину пути, описанного выше.

    2. Если U лежит во втором множестве, то сравнив длину нового найденного нами пути и ранее известное расстояние до этой вершины, запишем вместо ранее известного расстояния минимальное из них

    3. Если сосед U лежит в первом множестве, то с ним нам делать ничего не нужно, ведь до него наилучшее расстояние уже найдено, и с помощью любых дополнительных проверок улучшить его не удастся.

Алгоритм заканчивает свою работу, когда во втором множестве не останется вершин.

Заметим, что за каждый шаг работы алгоритма мы перемещаем одну вершину из второго множества в первое, и, возможно, добавляем вершины из третьего множества во второе. Так как вершин в третьем множестве конечное число, то алгоритм закончит свою работу. После окончания работы алгоритма второе множество будет пустым, в первом множестве будут все вершины, до которых существует кратчайшее расстояние, а в третьем множестве останутся вершины, попасть в которые из начальной невозможно (а значит, расстояние до них равно бесконечности).

Хранить множества лучше всего с помощью массива из N элементов, где соответствующий элемент равен 0, если вершина лежит в первом множестве, 1 - если во втором и 2 - если в третьем .

Восстановление пути
Заметим, что если кратчайший путь до вершины v проходит через вершину u, то часть этого пути до вершины u является кратчайшим путем до вершины u. Значит, чтобы сохранить путь до всех вершин достаточно для каждой вершины хранить предыдущую в кратчайшем пути до нее.
Задача 06-1. Разминка


Имя входного файла

input.txt

Имя выходного файла

output.txt

Максимальное время работы на одном тесте:

3 секунды

Формат входных данных
Во входном файле записано сначала число N (1<=N<=100), а затем N пар чисел. Первое число каждой пары - натуральное, не превышающее 30000. Второе число каждой пары - 0 или 1.

Формат выходных данных
Требуется найти и вывести в выходной файл номер пары, в которой второе число равно 1, а из всех таких пар ту, в которой первое число максимально (если таких пар несколько, выведите любую из них).
Если пар, у которых второе число равно 1 нет, выведите в выходной файл -1.

Пример

input.txt

output.txt

4

25 1


70 1

100 0


3 1

2

Эта задача представляет собой небольшую часть реализации алгоритма Дейкстры, а именно поиск вершины v из второго множества, известное расстояние от начальной вершины до которой минимально

Задача 06-2. Алгоритм Дейкстры



Имя входного файла

input.txt

Имя выходного файла

output.txt

Максимальное время работы на одном тесте:

5 секунд

Дан ориентированный взвешенный граф. Для него вам необходимо найти кратчайшее расстояние от вершины S до вершины F.

Формат входных данных
В первой строке входного файла три числа: N, S и F (1 <= N <= 100; 1 <= S, F <= N), где N - количество вершин графа. В следующих N строках записаны по N чисел - матрица смежности графа, где число в i-ой строке j-ом столбце соответствует ребру из i в j: -1 означает отсутствие ребра между вершинами, а любое неотрицательное число - наличее ребра данного веса. На главной диагонали матрицы всегда записаны нули.

Формат выходных данных
Вывести искомое расстояние или -1, если пути между указанными вершинами не существует.

Пример

input.txt

output.txt

3 1 2

0 -1 2


3 0 -1

-1 4 0


6

Задача решается применением алгоритма Дейкстры.

Задача 06-3. Заправки



Имя входного файла

input.txt

Имя выходного файла

output.txt

Максимальное время работы на одном тесте:

5 секунд

В стране N городов, некоторые из которых соединены между собой дорогами. Для того, чтобы проехать по одной дороге требуется один бак бензина. В каждом городе бак бензина имеет разную стоимость. Вам требуется добраться из первого города в N-ый, потратив как можно меньшее количество денег.

Формат входных данных
Во входном файле записано сначала число N (1<=N<=100), затем идет N чисел, i-ое из которых задает стоимость бензина в i-ом городе (все числа целые из диапазона от 0 до 100). Затем идет число M - количество дорог в стране, далее идет описание самих дорог. Каждая дорога задается двумя числами - номерами городов, которые она соединяет. Все дороги двухсторонние (то есть по ним можно ездить как в одну, так и в другую сторону); между двумя городами всегда существует не более одной дороги; не существует дорог, ведущих из города в себя.

Формат выходных данных
В выходной файл выведите одно число - суммарную стоимость маршрута или -1, если добраться невозможно.

Пример

input.txt

output.txt

4

1 10 2 15

4

1 2 1 3 4 2 4 3



3

4

1 10 2 15

0


-1

В первом примере оптимальное решение - из 1-го города поехать в 3-й, а затем в 4-й. Горючее придется покупать в 1 и 3 городах.

Фактически, задача отличается от предыдущей лишь форматом входных данных (подумайте, что в этой задаче будет являться весами ребер графа).

Задача 06-4. Автобусы


Имя входного файла

input.txt

Имя выходного файла

output.txt

Максимальное время работы на одном тесте:

5 секунд

Между некоторыми деревнями края Васюки ходят автобусы. Поскольку пассажиропотоки здесь не очень большие, то автобусы ходят всего несколько раз в день.

Марие Ивановне требуется добраться из деревни d в деревню v как можно быстрее (считается, что в момент времени 0 она находится в деревне d).



Формат входных данных
Во входном файле записано число N - общее число деревень (1 <= N <= 100), номера деревень d и v, затем количество автобусных рейсов R (0 <= R <= 10000). Затем идут описания автобусных рейсов. Каждый рейс задается номером деревни отправления, временем отправления, деревней назначения и временем прибытия (все времена - целые от 0 до 10000). Если в момент t пассажир приезжает в какую-то деревню, то уехать из нее он может в любой момент времени, начиная с t.

Формат выходных данных
В выходной файл вывести минимальное время, когда Мария Ивановна может оказаться в деревне v. Если он не сможет с помощью указанных автобусных рейсов добраться из d в v, вывести -1.

Пример

input.txt

output.txt

3

1 3


4

1 0 2 5


1 1 2 3

2 3 3 5


1 1 3 10

5

Построим граф, вершинами которого будут города, а ребрами - маршруты. Весом ребра назовем время прибытия автобуса в конечный пункт, а весом пути - вес последнего, самого тяжелого, ребра. Путем в нашем графе назовем последовательность ребер, такую что вес пути до любой промежуточной вершины v не превосходит времени отправления автобуса, соответствующего следующему ребру пути. В рамках введенных обозначений решение задачи сводится к реализации алгоритма Дейкстры на этом графе.

Занятие 7. Графы.

Поиск кратчайшего пути. Алгоритм Флойда.

Пусть дан взвешенный граф с N вершинами и M ребрами. Требуется найти кратчайшие расстояния между всеми парами. Эта задача может быть решена с помощью алгоритма Флойда.

Рассмотрим два случая:

I. В графе нет циклов отрицательного веса.

В основе алгоритма Флойда лежит метод динамического программирования. Пусть Ak - матрица размера NxN с элементами aki,j, где aki,j - длина кратчайшего пути между вершинами i и j, проходящего через вершины с номерами меньше либо равными k (не считая начальной и конечной вершин). Тогда A0 - матрица смежности нашего графа, An - искомая матрица кратчайших расстояний. Найдем aki,j, зная Ak-1. Заметим, что в кратчайшем пути между вершинами i и j, содержащем вершины с номерами от 1 до k (т.е. соответсвующем aki,j) вершина k может либо встречаться, либо нет. Значит aki,j = min(ak-1i,j , ak-1i,k + ak-1k,j).

Один из вариантов реализации алгоритма Флойда выглядит так:
   for k := 1 to n do
     for i := 1 to n do
       for j := 1 to n do
         if a[k,i,j] > a[k-1,i,k] + a[k-1,k,j] then
           a[k,i,j] := a[k-1,i,k] + a[k-1,k,j];

Пусть у нас есть кратчайший путь из вершины i в вершину k. Заметим тогда, что в этом пути вершина k не может встречаться среди промежуточных вершин. Действительно, пусть это не так, тогда в нашем графе найдется цикл отрицательного веса, а этого по условию быть не может. В наших обозначениях это выглядит так: a[k,i,k]=a[k-1,i,k] и a[k,k,j]=a[k-1,k,j] для любых i и j. Значит алгоритм Флойда можно изменить следующим образом:


   for k := 1 to n do
     for i := 1 to n do
       for j := 1 to n do
         if a[i,j] > a[i,k] + a[k,j] then
           a[i,j] := a[i,k] + a[k,j];

II. В графе есть циклы отрицательного веса.

В этом случае между некоторыми парами вершин может быть сколь угодно короткий путь. Найи такие пары несложно по матрице "кратчайших" путей, посторенных алгоритмом Флойда. Имеют место утверждения:



  1. Если существует цикл отрицательного веса, проходящий через вершину i, то ai,i будет меньше 0.

  2. Между парой вершин (i,j) существует сколь угодно малый путь тогда и только тогда, когда существует путь из i в j, содержащий цикл отрицательного веса или, иными словами, существует вершина k такая, что существует путь из i в k, из k в j и существует цикл отрицательного веса, проходящий через k

Задача 07-1. Флойд – 1




Имя входного файла

input.txt

Имя выходного файла

output.txt

Максимальное время работы на одном тесте:

5 секунд

Полный ориентированный взвешенный граф задан матрицей смежности. Постройте матрицу кратчайших путей между его вершинами. Гарантируется, что в графе нет циклов отрицательного веса.

Формат входных данных
В первой строке входного файла записано единственное число N (1 <= N <= 100) - количество вершин графа. В следующих N строках по N чисел - матрица смежности графа (j-ое число в i-ой строке соответствует весу ребра из вершины i в вершину j). Все числа по модулю не превышают 100. На главной диагонали матрицы - всегда нули.

Формат выходных данных
Выведите N строк по N чисел - матрицу кратчайших расстояний между парами вершин. j-ое число в i-ой строке должно быть равно весу кратчайшего пути из вершины i в вершину j.

Пример

input.txt

output.txt

4

0 5 9 100

100 0 2 8

100 100 0 7

4 100 100 0


0 5 7 13

12 0 2 8

11 16 0 7

4 9 11 0



Применим алгоритм Флойда...

Задача 07-2. Флойд




Имя входного файла

input.txt

Имя выходного файла

output.txt

Максимальное время работы на одном тесте:

5 секунд

Дан ориентированный взвешенный граф. Вам необходимо найти пару вершин, кратчайшее расстояние от одной из которых до другой максимально среди всех пар вершин.

Формат входных данных
В первой строке входного файла единственное число N (1 <= N <= 100) - количество вершин графа. В следующих N строках по N чисел - матрица смежности графа, где -1 означает отсутствие ребра между вершинами, а любое неотрицательное число - присутствие ребра данного веса. На главной диагонали матрицы - всегда нули.
1   2   3   4   5   6   7


База данных защищена авторским правом ©infoeto.ru 2022
обратиться к администрации
Как написать курсовую работу | Как написать хороший реферат
    Главная страница