Автор: Пользователь скрыл имя, 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);
    }    
  
Литература