Министерство образования и науки Российской Федерации
Новосибирский Государственный Технический Университет
Кафедра прикладной математики
Курсовая работа по практикуму на ЭВМ:
структуры данных и алгоритмы
Факультет: прикладной математики и информатики
Группа:
Студент:
Преподаватели:
Новосибирск 2009
1. Условие
В системе двусторонних дорог за проезд каждой дороги взимается некоторая пошлина. Найти путь из города A в город B с минимальной величиной S + P, где S – сумма длин дорог пути, а P – сумма пошлин проезжаемых дорог.
2. Анализ задачи
2.1. Исходные данные задачи:
n – количество городов,
m – количество дорог,
G – список дорог,
A – исходный город,
B – конечный город,
2.2. Результат:
- маршрут из A в B с минимальной величиной S + P; “No Way”, если маршрута нет
2.3. Решение:
Математическая модель системы двусторонних дорог – неориентированный взвешенный помеченный граф с весовой функцией , причём . При этом вершины соответствуют городам (метка вершины – название города), а рёбра – двусторонним дорогам. Вес ребра определяется по формуле , где - длина дороги между городами u и v, - пошлина, взимаемая за проезд по этой дороге. В случае существования нескольких дорог между одной и той же парой городов, в граф добавляется ребро с наименьшим весом (поскольку задача состоит в отыскании пути с наименьшим весом).
Для нахождения маршрута в графе с наименьшим весом, хорошим алгоритмом является алгоритм Дейкстры. Алгоритм Дейкстры решает задачу о кратчайших путях из одной вершины k для взвешенного ориентированного графа , в котором все веса рёбер неотрицательны.
Основные подзадачи:
Ввод системы дорог
Нахождение кратчайшего пути
Формальная постановка задачи
Построить граф заданной системы дорог, найти кратчайший путь между двумя заданными вершинами.
Основные подзадачи:
Ввод системы дорог
2) Нахождение кратчайшего пути
3. Структуры данных, используемые для представления исходных данных и результатов задачи
3.1. Входные данные
Внешнее представление системы двусторонних дорог:
<система-дорог> ::= <количество-городов> <количество-дорог> <список-дорог>
<количество-городов> ::= <натуральное-число>
<количество-дорог> ::= <натуральное-число>
<название-города> ::= <буква>|<название-города> <буква>
<список-дорог> ::= <дорога>|<дорога> <список-дорог>
<дорога> ::= <название-города> <название-города> <расстояние> <пошлина>
<расстояние> ::= <натуральное-число>
<пошлина> ::= <натуральное-число>
Внутреннее представление системы двусторонних дорог:
Для алгоритма Дейкстры хорошим представлением графа является представление списками смежности. Список смежности даёт компактное представление для разреженных графов – тех, у которых множество рёбер много меньше множества вершин, что характерно для системы дорог. Чтобы не усложнять списки смежности, вместо названия города будем помечать вершину номером. Вершины пронумеруем с нуля. Список смежных вершин представим двусвязным закольцованным списком (такой список можно так же использовать в качестве очереди, требуемой для алгоритма Дейкстры).
list *G[100]; // Список смежности вершин
char city[100][100]; // Массив городов
3.2. Выходные данные
Внешнее представление: список вершин маршрута или текстовое сообщение «Пути нет»
Внутреннее представление:
Pr[] – массив предшественников вершин;