Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
YaP_laby.pdf
Скачиваний:
156
Добавлен:
31.05.2015
Размер:
915.49 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА № 15 АЛГОРИТМЫ НА ГРАФАХ

Цель работы – овладеть навыками алгоритмизации и программирования задач, в которых используются графы.

Задания

1.Изучить:

а) терминологию, основные определения и понятия по теме «Графы»;

б)представления графов для решения задач с помощью компьютера; в) алгоритмы обхода графа в глубину и ширину; г) программные реализации алгоритмов обхода графов;

д)программные реализации поиска остовного дерева графа, которые основаны на обходах графа в глубину и ширину;

е) алгоритм Дейкстры для поиска кратчайших путей от некоторой вершины a до остальных вершин.

2.Разработать алгоритм решения в соответствии с заданием.

3.Составить программу решения задачи.

4.Отладить программу.

Контрольныевопросы

1.Дать определение графа.

2.Дать определение остовного дерева графа.

3.Перечислить способы представления графа для решения задач с помощью компьютера.

4.Построить пример ориентированного графа с пятью вершинами. Представить граф матрицей смежности.

5.Построить пример ориентированного графа с пятью вершинами. Представить граф матрицей инциденций.

6.Построить пример неориентированного графа с пятью вершинами. Представить граф матрицей смежности.

7.Построить пример неориентированного графа с пятью вершинами. Представить граф матрицей инциденций.

8.Построить пример ориентированного графа с пятью вершинами.

Представить граф списком инцидентности.

9.Построить пример ориентированного взвешенного графа с пятью вершинами. Представить граф матрицей смежности.

10.Построить пример ориентированного графа с пятью вершинами.

Представить граф в виде структуры с оглавлением.

11.Перечислить переменные, которые необходимы для программы обхода графа в ширину. Объясните назначение этих переменных.

12.Перечислить переменные, которые необходимы для программы об-

хода графа в глубину. Объясните назначение этих переменных.

Языки программирования. Метод. указания по лаб. работам

-74-

ЛАБОРАТОРНАЯ РАБОТА № 15 АЛГОРИТМЫ НА ГРАФАХ

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

1.Найти в графе вершину с минимальной степенью.

2.Найти в графе вершину с максимальной степенью.

3.Дан граф. Можно ли закрыв три дороги, добиться того, чтобы из вершины A нельзя было бы попасть в вершину B.

4.Найти медиану графа, то есть такую вершину, чтобы сумма расстояний от нее до всех остальных вершин была минимальной.

5.Из графа удалить вершины, из которых недостижима заданная вершина.

6.Источником орграфа назовем вершину, от которой достижимы все другие вершины; стоком – вершину, достижимую от всех других вершин. По орграфу найти все его источники и стоки.

7.Проверить наличие цикла в заданном графе.

8.Проверить наличие цепи в заданном графе.

9.Реализовать алгоритм Дейкстры для нахождения кратчайшего пути между двумя заданными вершинами графа.

10.Задана система двусторонних дорог. Найти два города и соединяющий их путь, который проходит через каждую из дорог графа ровно один раз.

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

12.Вычислить диаметр заданного графа.

13.В графе найти вершину, наиболее удаленную от заданной.

14.Проверить связность заданного графа.

15.Определить, является ли заданный граф деревом.

16.В графе найти все вершины, к которым существует путь длины n из некоторой заданной.

17.В графе найти все вершины, от которых существует путь длины n к заданной вершине.

18.Определить, является ли граф двудольным.

19.Определить, является ли граф эйлеровым.

20.Определить, является ли граф гамильтоновым.

21.Построить минимальное покрывающее дерево в графе, используя алгоритм Краскала.

22.Построить минимальное покрывающее дерево в графе, используя алгоритм Прима.

23.В данном графе найти вершину с максимальной степенью.

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

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

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

Языки программирования. Метод. указания по лаб. работам

-75-

ЛАБОРАТОРНАЯ РАБОТА № 15 АЛГОРИТМЫ НА ГРАФАХ

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

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

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

B.

29.Задана система двусторонних дорог и город A. Определить все города, расстояния от которых до города A больше n.

30.Определить, можно ли в заданной системе односторонних дорого проехать из города A в город B таким образом, чтобы посетить город C и не проезжать никакой дороги более одного раза.

В метод. указаниях Шитов, Ю. А. Дискретная математика. Графы / Ю. А. Шитов. – Красноярск : ИПК СФУ, 2007 дан большой набор программ для решения задач по графам. Эти пособия могут существенно облегчить и помочь студентам выполнять работы данного пункта. Но базовыми алгоритмами для решения задач на графах являются алгоритмы обхода графа в глубину и ширину. Приведем две программы обхода графа в глубину (нерекурсивную, и рекурсивную). Граф задается матрицей смежности. Матрица считывается из файла. Текст программ взят из первой части выше названного пособия. Кроме того отметим такой факт, что рекурсивная программа обхода графа в глубину является базовой для решения задач, которые связаны с перебором путей.

// Нерекурсивный обход графа в глубину от начального узла.

#include <stdio.h> #include <conio.h> #include <ctype.h> #include <iostream.h> const n = 13, m = 13;

void vv_mat ( FILE *fr, int b[][m], int n1); // Функция ввода матрицы. void glubina ( int b[][m], int v); // Функция обхода графа.

void main(void)

{

FILE *f1;

int j, kar, a[n][m], b[n]; int jr;

clrscr();

// Ввод матрицы из файла. f1 = fopen("lipskii.dat", "r");

vv_mat( f1, a, m); fclose(f1);

kar = 0; // kar – начальный узел обхода. glubina(a,kar);

Языки программирования. Метод. указания по лаб. работам

-76-

int j, k, l; int c, rr;

ЛАБОРАТОРНАЯ РАБОТА № 15 АЛГОРИТМЫ НА ГРАФАХ

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

getch();

}

void glubina ( int a[][m], int v) // v – вершина, с которой начинается

// обход.

{

int st[n], r[n]; // r[] – массив для маркировки вершин графа: // r[i] = -1вершина не пройдена;

// c- параметр состояния: с = 1 – у вершины

//не нашлось смежной не пройденной.

//c=0- нашли не пройденную смежную вершину.

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

r[j] = -1;

 

k = 0;

// k – указатель на вершину стека.

st[k] = v;

// В стек засылаем вершину, с которой начинаем

 

// обход графа.

rr = v+1; //для соответствия индекса и номера вершины

cout << "****** Посетили узел- " << rr << "\n";

r[v] = 1;

// Фиксируем состояние: вершина v пройдена.

j = -1;

// j- текущий индекс для строки матрицы смежности.

do

 

{

 

c = 1;

 

l = st[k];

// Из стека в переменную l засылаем номер

//очередной вершины, от которого начинаем (продолжаем)

//перебор вершин графа. Если c=0 поиск вершины завершается.

//---------------------

Начало: Поиск 1-й вершины смежной с l

do

//Цикл прекращает поиск, как только нашли продолжение

{//пути.

j++;

 

// формируем номер вершины пути.

if ( j > n-1 ) // Все вершины перебрали, надо выходить из

c = 0;

// поиска.

else

 

// Поиск пути из l в смежный узел j.

if ( (a[l][j] == 1) && ( r[j] == -1 )) c = 0;

} while (c);

Конец: Поиска j-й вершины смежной с l.

//---------------------

 

//---------------

Начало: Из стека удаляем вершину, из которой не найдено

 

// продолжение пути.

if ( j > n-1

)

// От вершины l не нашли пути, хотя

{

 

// все смежные с l перебрали

j = l;

 

 

k--;

//

Вершину l исключаем из стека.

Языки программирования. Метод. указания по лаб. работам

-77-

ЛАБОРАТОРНАЯ РАБОТА № 15 АЛГОРИТМЫ НА ГРАФАХ

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

}

Начало: Если Найдена вершина j, смежная с l, ее надо в стек.

//---------------

else

 

{

// Найденную очередную вершину j засылаем в стек.

k++;

st[k] = j; // Cмежную вершину j в стек. r[j] = l; // Пометили: вершину j прошли.

rr = j+1; // Номер вершины на 1 больше индекса. cout << "****** Посетили узел- " << rr << "\n";

j = -1;

}

} while ( k != -1 );

}

//Ввод матрицы из файла. void vv_mat (FILE *fr, int b[][m], int n1)

{

int i, j;

for ( i = 0; i < n1; i++ ) for ( j = 0; j < m; j++)

fscanf( fr, "%d", &b[i][j] );

}

// Рекурсивный обход графа в глубину от начального узла.

int *res; // Массив для маркировки вершин графа. int **graph; // Для матрицы смежности графа. int n; // Размерность матрицы.

void read_matr()

{

FILE *f; int i, j;

f = fopen ("lip_rek.dat", "r");

fscanf(f, "%d", &n); // Из файла вводим размерность матрицы. graph=new int*[n]; // Выделяем динамическую память под матрицу. for (i=0; i<n; ++i) graph[i]=new int[n];

// Вводим матрицу из файла. for (i=0; i<n; ++i)

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

fscanf(f, "%d", &graph[i][j]); fclose(f); // Закрываем файл.

res=new int[n]; // Выделяем динамическую память под массив res. for (i=0; i<n; ++i) res[i]=0; // Маркируем вершины: не пройдены.

}

Языки программирования. Метод. указания по лаб. работам

-78-

ЛАБОРАТОРНАЯ РАБОТА № 15 АЛГОРИТМЫ НА ГРАФАХ

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

// Рекурсивная функция для обхода графа в глубину. void deep_matr(int v)

{

cout << "Node: " << v+1 << "\n"; // обработка вершины res[v]=1;

for (int i=0; i<n; ++i) // поиск смежных с v непройденных вершин.

{

if (graph[v][i] && !res[i]) deep_matr(i);

}

}

void main()

{

clrscr(); read_matr(); deep_matr(0); getch();

}

Языки программирования. Метод. указания по лаб. работам

-79-

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]