Решение задачи на вычисление количества бензина для проезда между несколькими городами

Страницы работы

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.

Содержание работы

Министерство образования и науки Российской Федерации

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА ПРИКЛАДНОЙ МАТЕМАТИКИ

Курсовая работа

по практикуму на ЭВМ: структуры данных и алгоритмы

Факультет                                                     прикладной математики и информатики

Группа                                                           ПМ-92

Студент                                                         Чемерилов А.В.

Преподаватель                                              Шапошникова Т.А.

Новосибирск 2010

1. Условие задачи

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

 Входные данные

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

между двумя городами всегда существует не более одной дороги; не существует дорог, ведущих из города в себя.

 Выходные данные

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

2. Анализ задачи

2.1. Исходные данные задачи: n- количество городов, nÎN, 1≤n≤100,

B- множество значений стоимости бензина, B= {bi|biÎZ, 0≤bi≤100-стоимость бензина в i-ом городе, i=1,…,n},

m- количество дорог,  

S- система дорог, S={aj, cj|aj, cjÎN, 1≤aj, cj≤n, aj≠cj, aj- город начала дороги, сj- город конца дороги, j=1, 2, …,m}

2.2. Результат:  RezÎN U {0}- стоимость проезда, если добраться возможно, -1- если добраться не возможно.

2.3. Решение: Математическая модель системы дорог -  это неориентированный взвешенный несвязный (так как в задаче не говорится, что все города обязательно должны быть связаны дорогами) граф G=(V, E) с весовой функцией w:E→Z, причем w(u, v)≥0 и вес всех ребер исходящих из одной вершины u будет одинаковым для всех (u, v) ÎE.

 Взвешенным графом назовем пару (G, w) для которой выполняется следующее:

пусть G – граф, w: EG→R+ вещественнозначная функция, ставящая в соответствие каждому ребру eнеотрицательное число w(e) – вес ребра e.

 В данной задаче вершины соответствуют городам, а дуги - дорогам. Дуга (u,v) ведет из вершины u в вершину v, где u- это вершина, соответствующая городу-началу дороги, а v- вершина, соответствующая городу- концу дороги. Вес дуги (u, v)  равносилен количеству затраченных денег на бензин, необходимых для того чтобы проехать из города u в город v. Вес ребра (u,x) для любой вершины x смежной с вершиной u одинаковый, то есть w(u,x1)=w(u,x2)=…=w(u,xq),

где q-количество смежных вершин для вершины u.

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

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

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

 Формальная постановка задачи.

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

 Самый дешевый путь из первого города в последний это тот, который образуют дуги, сумма весов которых минимальна, по сравнению с суммой весов дуг, образующих любой другой маршрут в последний город из первого.

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

 Если доехать можно, то  t=1 и a= первый возможный маршрут и

пока не перебрал все  другие, отличные от a, маршруты b

                                         повторять

                                                   если a>=b, то a=b

 Если t=1 то, result=a, иначе result=-1

 Для нахождения кратчайшего пути будем использовать алгоритм Дейкстры.           Алгоритм Дейкстры решает задачу о кратчайших путях из одной вершины для взвешенного неориентированного графа G(V, E) с исходной вершиной s (в моем случае s=1), в котором веса всех ребер неотрицательны (w(u, v)≥0 для всех (u, v) Î E).

 Основные подзадачи:

 1) Поиск самого дешевого пути от первого города до последнего

 2) Ввод системы дорог

3. Структуры данных, используемых для представления исходных данных и результатов задачи

3.1. Входные данные

 Внешнее представление

<система – дорог>::= <количество – городов> <список – цен> <количество – дорог> <список – дорог>

<количество – городов>::= натуральное число

<список – цен>::= пробел | пробел <цена> <список – цен>

Похожие материалы

Информация о работе

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.