Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная по МП 3,4.docx
Скачиваний:
3
Добавлен:
04.11.2018
Размер:
89.35 Кб
Скачать

Пример выполнения задания 2

Задание. Найти гамильтонов цикл в графе, заданном с помощью матрицы смежности.

Решение. Возьмем схему перебора с возвратом, рассмотренную для гамильтоновых циклов в п. 1.3. Мы модифицируем её так, чтобы программа заканчивала работу при обнаружении гамильтонова цикла. Подпрограмма будет возвращать значение 1 в случае нахождения гамильтонова цикла, и 0 – если таких циклов в графе нет. Получим следующую схему подпрограммы:

int gamilton(int k)

{

int v, q1=0; //q1 – возвращаемое значение

for(yAk&&(q1==0))

{

//Ak – смежные с xk-1 вершины

if(k==n&&v=v0) q1=1;

else

{

xk=y; c[y]=k;

q1=gamilton(k+1);

if(q1==0)c[y]=0;

}

else continue;

}return q1;

}

main()

{

обесцветить вершины;

раскрасить c[0]=0;

if(gamilton(1))вывод;

else printf(“нет решений”);

}

Детализируя её, приходим к следующему тексту программы:

// gamiltg1.cpp -- гамильтонов путь

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

#define n 10

int c[n] ; // номер хода, на котором посещается вершина

int path[n]; // номера посещаемых вершин

int v0=2; // начальная вершина

//Матрица смежности

int a[n][n]=

{

0,0,0,0,0,1,0,0,0,0,

0,0,1,0,0,0,1,0,0,0,

0,1,0,1,0,0,0,1,0,0,

0,0,1,0,1,0,0,0,1,0,

1,0,0,1,0,0,0,0,0,1,

0,0,0,0,0,0,1,0,0,1,

0,0,0,1,0,0,0,1,0,0,

0,0,0,0,1,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,1,

0,0,0,0,0,0,0,0,0,0

};

void prnt(void)

{

int p;

for ( p = 0 ; p<n ; p++)

printf("%d ", path[p] ) ;

printf("%d ", path[0] ) ;

printf("\n") ;

}

//подпрограмма нахождения гамильтонова цикла

int gamilton ( int k)

{

int v,q1=0;

//, n=sizeof(a)/2;

for(v=0; v<n && !q1; v++)

{

if(a[v][path[k-1]]||a[path[k-1]][v])

{

if (k==n && v==v0 ) q1=1;

else if (c[v]==-1)

{

c[v] = k ; path[k]=v;

q1=gamilton (k+1) ;

if (!q1) c[v]=-1;

} else continue;

}

} return q1;

}

main()

{

int j;

clrscr() ;

printf("Гамильтонов цикл:\n");

for(j=0;j<n;j++) c[j]=-1;

path[0]=v0 ;

c[v0]=v0;

if(gamilton (1)) prnt(); else printf("Нет решений\n");

}

Результат работы программы

Гамильтонов цикл:

2 1 6 3 8 9 5 0 4 7 2

Отметим, что матрице смежности в рассмотренном примере соответствует следующий плоский граф:

Лабораторная 4 Задание

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

  1. время выполнения;

  2. число сравнений;

  3. число перестановок.

Варианты заданий

Метод пузырьков

Метод выбора

Двоичные вставки

Метод Шелла

Быстрая Хоара

Обменная поразрядная

Турнир с выбыванием

Пирамидальная

Простые вставки

1

2

3

4

5

6

7

8

Метод

пузырьков

-

9

10

11

12

13

14

15

Метод

выбора

-

-

16

17

18

19

20

21

Двоичные вставки

-

-

-

22

23

24

25

26

Быстрая Хоара

-

-

-

-

-

27

28

29

Обменная поразрядная

-

-

-

-

-

-

30

-