![](/user_photo/_userpic.png)
2. Описание алгоритма работы. Блок-схема
1) Введем 3 массива: для учёта посещенных вершин, для сохранения текущего пути, и для запоминания индекса вершины, на которой произошёл переход на очередную ветку маршрута.
2) Флаги посещения устанавливаем в false. Индексы в массиве переходов устанавливаем в -1. Некоторую вершину выбираем текущей.
3) Для каждой смежной с текущей вершины (не учитывая предыдущие пути), если мы ее не посещали, сохраняем ее индекс в массиве переходов («на чём остановились»), текущей делаем найденную вершину и запоминаем ее в массиве пути.
4) Если вершин, смежных с текущей вершиной, на которых мы ещё не были, нет, то в массиве «на чём остановились» для текущей вершины записываем -1, помечаем данную вершину как непосещенную, делаем «откат» на 1 вершину в пути назад, соответственно текущей становится предыдущая вершина.
5) Работа функции прекращается с результатом true, если заполнен массив пути и если существует путь между последней найденной вершиной и первой. Если путь не найден и «откат» невозможен, то возвращаем false.
6) Переходим к шагу 2.
-
3. Пример решения задачи
Задача 1
Ручной счет
Рис.1
Тест программы
Рис.2
Задача 2
Ручной счет
Рис.3
Гамильтоновы циклы: 1,2,3,4,0,1; 1,3,2,0,4,1; 1,2,0,4,3,1; 1,0,2,3,4,1; 1,4,3,2,0,1; 1,4,0,2,3,1; 1,3,4,0,2,1;
Тест программы
Рис.4
Задача 3
Рис.5
Гамильтоновы циклы: 1,2,3,4,0,1; 1,0,4,3,2,1;
Тест программы
Рис.6
Заключение
В ходе курсовой работы была разработана программа нахождения гамильтонова цикла в графе, используя алгоритм с возвратом.
Согласно условиям, заданным в техническом задании, были найдены электрические параметры всех элементов цепи, после чего была подобрана согласующаяся с ними реальная элементная база.
В работе использовались биполярные транзисторы типа n-p-n ГТ122Б, резисторы ряда E24. Параметры всех элементов были указаны в ходе проведения расчётов, а также ниже, в разделе «Приложения».
Список используемой литературы
1. Дж. Макконнелл. Основы современных алгоритмов. 2-е дополнительное издание.
2. Ж. Трамбле, П. Соренсон – Введение в структуры данных. 1982г.
3. В.А. Евстигнеев, В.Н. Касьянов – Графы в программировании: обработка, визуализация и применение.
4. В.Л. Бурковский, Л.В. Холопкина, Н.Л. Райхель, О.Я. Кравец – Методы моделирования и анализа вычислительных систем. Учебное пособие. 1996г.
5. В. Липский – Комбинаторика для программистов. 1988г.
6. Ф. Харари – Теория графов. 1973г.
Приложения
Приложение 1.
Код программы:
#include "stdafx.h"
#include <stdio.h>
#define n 10
bool boo[n];
int way[n], r[n];
int a[n][n]=
{
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0
};
bool gamilton(int start)
{
int cur = start; int next = 0; way[next++] = cur; bool found;
while (true)
{
found = false;
boo[cur] = true;
for (int i = r[cur] + 1; i < n; i++)
if (i != cur && (a[i][cur] || a[cur][i]) && !boo[i])
{
found = true;
r[cur] = i;
way[next++] = cur = i;
break;
}
if (!found)
{
if (next == 1) return false;
r[cur] = -1;
boo[cur] = false;
cur = way[--next - 1];
}
else
if (next == n && (a[cur][start] || a[start][cur])) return true;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
printf("Solution:\n");
for (i = 0; i < n; i++) { boo[i] = false; r[i] = -1; }
if (gamilton(1))
{
for (i = 0; i < n; i++) printf("%d ", way[i]);
printf("%d\n", way[0]);
}
else
printf("Solution Not Found!\n");
getchar();
}
Таганрог,