Автор: Пользователь скрыл имя, 24 Марта 2011 в 17:54, курсовая работа
Пусть G – псевдограф. Цепь (цикл) в G называется гамильтоновой (гамильтоновым), если она (он) проходит через каждую вершину псевдографа G ровно один раз. Простейшим достаточным условием существования гамильтоновых цепей и циклов в графе является его полнота. Граф G называется полным, если каждая его вершина смежна со всеми остальными вершинами. Необходимым условием существования гамильтоновых цепей и циклов в графе G является связность данного графа
Введение 3
1. Постановка задачи 4
1.2 Назначение и область применения 5
2. Описание алгоритма решения задачи 5
2.1 Построение гамильтоновой цепи графе 5
2.2 Алгоритм генерации всех перестановок вершин в антилексикографическом порядке 5
2.3 Описание программы 6
Листинг программы 8
Литература 10
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ТЮМЕНСКИЙ
ГОСУДАРСТВЕННЫЙ
НЕФТЕГАЗОВЫЙ УНИВЕРСИТЕТ»
студент группы АСОИУ-07-1
Проверила:
Тюмень 2008
Введение
Задание на курсовую работу по дисциплине «Дискретная математика».
Студент группы АСОИУ
Специальность
«Автоматизированные системы
Тема:
«Построить гамильтонову цепь в графе,
используя рекурсивный алгоритм генерации
всех перестановок вершин в антилексикографическом
порядке.
Условие задачи:
1.Построение гамильтоновой цепи графе используя алгоритм генерации всех перестановок вершин.
2. Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в матрицу смежности;
- вывод на экран графа;
- нахождение в полученном графе гамильтоновой цепи.
1. Построение гамильтоновой цепи графе используя алгоритм генерации всех перестановок вершин.
Пусть G – псевдограф. Цепь (цикл) в G называется гамильтоновой (гамильтоновым), если она (он) проходит через каждую вершину псевдографа G ровно один раз. Простейшим достаточным условием существования гамильтоновых цепей и циклов в графе является его полнота. Граф G называется полным, если каждая его вершина смежна со всеми остальными вершинами. Необходимым условием существования гамильтоновых цепей и циклов в графе G является связность данного графа.
2.
Рекурсивный алгоритм генерации всех
перестановок вершин.
Алгоритм генерирования перестановок в антилексикографическом порядке сформулировать удобнее. Заметим, что последовательность перестановок множества {1,2,…, n} в этом случае имеет следующие свойства, вытекающие непосредственно из определения:
Данная программа применима в среде Widows в области дискретной математики для решения задач связанных с поиском и построение гамильтоновой цепи графе используя рекурсивный алгоритм. Упрощает расчетную работу пользователю, увеличивает скорость его работы.
Пусть G – псевдограф. Цепь (цикл) в G называется гамильтоновой (гамильтоновым), если она (он) проходит через каждую вершину псевдографа G ровно один раз. Простейшим достаточным условием существования гамильтоновых цепей и циклов в графе является его полнота. Граф G называется полным, если каждая его вершина смежна со всеми остальными вершинами. Необходимым условием существования гамильтоновых цепей и циклов в графе G является связность данного графа.
Антилексикографический порядок (обозначим <¢ ) определяется следующим образом:
<x1,x2,…xn> <¢ <y1,y2,…,y n> Û существует такое k£n, что xk > yk и xp = yp для каждого p > k..
Для примера приведем перестановки множества X = {1,2,3} в антилексикографическом порядке: 123, 213, 132, 312, 231, 321.
Алгоритм генерирования перестановок в антилексикографическом порядке сформулировать удобнее. Заметим, что последовательность перестановок множества {1,2,…, n} в этом случае имеет следующие свойства, вытекающие непосредственно из определения:
Сгенерируем в антилексикографическом порядке все перестановки для n=4, получим
1 | 2 | 3 | 4 | 1 | 2 | 4 | 3 | 1 | 3 | 4 | 2 | 2 | 3 | 4 | 1 | |||
2 | 1 | 3 | 4 | 2 | 1 | 4 | 3 | 3 | 1 | 4 | 2 | 3 | 2 | 4 | 1 | |||
1 | 3 | 2 | 4 | 1 | 4 | 2 | 3 | 1 | 4 | 3 | 2 | 4 | 2 | 3 | 1 | |||
3 | 1 | 2 | 4 | 4 | 1 | 2 | 3 | 4 | 1 | 3 | 2 | 2 | 4 | 3 | 1 | |||
2 | 3 | 1 | 4 | 2 | 4 | 1 | 3 | 3 | 4 | 1 | 2 | 3 | 4 | 2 | 1 | |||
3 | 2 | 1 | 4 | 4 | 2 | 1 | 3 | 4 | 3 | 1 | 2 | 4 | 3 | 2 | 1 |
2.3 Описание
программы
Данная
программа написана на языке программирования
Borland C++ Builder Enterprise v6.0.
Состоит программа из двух форм. На главной форме задается сам граф. Его можно задать двумя способами:
В данной
программе можно редактировать
полученный граф, то есть добавлять
или удалять вершину или ребро.
На второй форме показаны все возможные гамильтоновы циклы в заданном графе. Эта форма появляется на после нажатия на кнопку в «Задание» в главном меню.
Листинг
программы
Пример. Построение гамильтоновой цепи графе используя рекурсивный алгоритм
##include <iostream.h>
#include <stdio.h>
FILE* fi = fopen("g_graph.txt","r"); // Файл с матрицей смежности
FILE* fo = fopen("g_cycle.txt","w"); // Файл с найденными циклами
bool
**graph; //Матрица смежности для
int n; //Количество вершин в графе
const int vertex = 1; // первая вершина при поиске
int
*St; //Массив для хранения
int *Nnew; //Массив признаков: вершина просмотрена или нет
void
out_way(int n){ //Процедура вывода
for(int i=0;i<n;i++)
fprintf(fo,"%d\ ",St[i]);
fprintf(fo,"%d\n",vertex);
}
void gamilton_path(int k){
int v = St[k-1]; // текущая вершина
for(int j = 0;j < n;j++)
if(graph[v][j]==1) // есть ребро между v и j
if(k==n && j==vertex)out_way(n); //прошли все вершины
else
if(Nnew[j]){ // вершина не просмотрена
St[k]=j; // добавляем ее к пройденному пути
Nnew[j]=false; // просмотрена
gamilton_path(k+1); //строим путь дальше
Nnew[j]=true; //возвращаемся назад и строим другие циклы
}
}
int main(){
fscanf(fi,"%d",&n); //Считываем количество вершин
St = new int[n];
Nnew = new int[n];
for(int i = 0;i < n;i++)Nnew[i]=1; // Нет просмотренных вершин
graph = new bool*[n];
for(int i=0;i<n;i++){
graph[i] = new bool[n]; //выделяем память под строку
for(int j=0;j<n;j++){
fscanf(fi,"%d",&graph[i][
}
}
Nnew[vertex]=false;
//первая вершина уже
St[0]=vertex; // вершина с которой начали проход
gamilton_path(1);//
fcloseall();
return(0);
}
Литература