Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2011 / 2011 / UP_MODPR_.RTF
Скачиваний:
48
Добавлен:
12.03.2015
Размер:
541.34 Кб
Скачать

3.3. Описание модулей

3.3.1. Main - главный модуль

ОБРАЩЕНИЕ ИЗ MS DOS: pkrc

ЗАГОЛОВОК: void main ()

ФУНКЦИЯ: Ввод графа из стандартного входного файла stdin, поиск в нем цикла минимальной длины, вывод результата и сообщений об ошибках в стандартный выходной файл stdout.

ВХОДНЫЕ ДАННЫЕ: Нет.

ВЫХОДНЫЕ ДАННЫЕ: Нет.

ЗНАЧЕНИЕ: Нет.

РАБОЧИЕ ДАННЫЕ:

cmin - номера вершин минимального цикла (пути);

dcmin - длина цикла минимальная;

g - матрицa смежности графа.

i - номер вершины;

kp - количество петель;

kz - код завершения подпрограммы;

n - количество вершин;

АЛГОРИТМ: см. алгоритм 3.2.

Алгоритм 3.2. Алгоритм модуля main

Вывод сообщения 3;

kz = vvodg (n, g); /* ввод графа */

if (kz > 2)

{ Вывод сообщения kz+2;

Вывод сообщения 8;

} else

{ if (kz == 1) Вывод сообщения 9;

kp = 0;

for (i=0; i<n; i++) kp = kp + g[i][i];

if (kp) Вывод сообщения 10;

if (pminc (n, g, dcmin, p))

Вывод сообщения 2;

else

{ Вывод (сообщениe 1, dcmin);

vyvodp (dcmin+1, cmin); /* вывод min цикла */

}

}

3.3.2. Pminc - поиск минимального цикла

ЗАГОЛОВОК:

int pminc (int n, char g[NMAX][NMAX], int *dcmin, int c[])

ФУНКЦИЯ: Поиск минимального цикла в графе с количеством

вершин n и матрицей смежности g.

ВХОДНЫЕ ДАННЫЕ:

n - количество вершин;

g - матрицa смежности графа.

ВЫХОДНЫЕ ДАННЫЕ:

c - номера вершин найденного цикла;

dcmin - длина найденного цикла (3..n).

ЗНАЧЕНИЕ:

0 - цикл найден;

1 - граф не имеет циклов.

РАБОЧИЕ ДАННЫЕ:

v - стек с номерами вершин текущего пути;

к - указатель стека v (индекс свободной позиции).

ИСПОЛЬЗУЕМЫЙ МЕТОД: итеративный обход графа в глубину

(см. раздел 3.1).

АЛГОРИТМ: см. алгоритм 3.3.

Алгоритм 3.3. Алгоритм модуля pminc

/* Поиск кратчайшего цикла обходом графа в глубину */

dcmin = n + 1; /* длина минимального цикла (3..n) */

for (v[0]=0; v[0]<n && dcmin>3; v[0]++) /* нач-я вершина */

{ /* Обход в глубину дерева путей, начинающихся с v[0] */

k = 1; v[1] = v[0]+1; /* начальный номер преемников v[0]*/

do

{ найти номер вершины vn очередного преемника v[k-1];

if (есть vn && k<dcmin) /* есть путь вперед */

{ v[k] = vn; /* вперед: vn - в стек */

v[k+1] = v[0]; /* начальный номер преемников v[k] */

if (v[0]...v[k] - цикл)

{ dcmin = k;

c[0]...c[k] = v[0]...v[k]; /* запомнить цикл */

k = k - 3; /* назад: удалить 2 вершины пути */

v[k+1]++; /* следующий преемник v[k] */

}

k++;

}

else /* назад */

{ v[k]++; /* следующий преемник v[k-1] */

k--; /* удалить v[k] из стека */

}

}

while (k > 0 && dcmin>3); /* стек не пуст */

}

return dcmin>n;