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

Приложение 2. Текст программы модуля main

/**************************************************************/

/* Курсовая работа */

/* по алгоритмическим языкам и программированию */

/* Поиск кратчайшего цикла в графе */

/* Группа 4105 И.И. Иванов 17.03.95 */

/**************************************************************/

#include <stdio.h>

#include "graf.h"

void main()

{

int n; /* количество вершин графа */

char g[NMAX][NMAX]; /* матрицa смежности графа */

int i; /* номер вершины */

int cmin[NMAX+1]; /* номера вершин минимального цикла */

int dcmin; /* длина цикла минимальная */

int kp; /* количество петель */

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

vyvsoob (3); /* "Введите граф ..." */

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

if (kz > 1) /* Ввод прерван */

{ vyvsoob (kz+2); /* Вывод сообщения 5 - 7 */

if (kz == 3) /* Недопустимое n */

printf (" %d\n", NMAX);

if (kz == 4) /* Недопустимый N верш. */

printf (" %d\n", n-1);

vyvsoob (8); /* Решение прекращено */

}

else

{ if (kz == 1) /* Было повторение ребер */

vyvsoob (9); /* Вывод сообщения 9 */

vyvmsm (n, g);

/* подсчет и удаление петель */

kp = 0;

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

{ kp = kp + g[i][i];

g[i][i] = 0;

}

if (kp) vyvsoob (10); /* Были петли (удалены) */

if (pminc (n, g, &dcmin, cmin)) /* поиск min цикла */

vyvsoob (2); /* Нет циклов */

else

{ vyvsoob (1); /* Минимальный цикл... */

printf ("%d:\n", dcmin);

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

}

}

}

Приложение 3. Текст программы модуля pminc

/********************************************************************/

/* Поиск минимального цикла в графе с количеством вершин n, */

/* матрицей смежности g. Значение функции: 0 - цикл найден, */

/* 1 - граф не имеет циклов. Номера вершин найденного цикла */

/* - в векторе c, его длина - dcmin (3..n). */

/* Метод: итеративный обход графа в глубину. */

/* И.И. Иванов 13.03.95 */

/********************************************************************/

#include "graf.h"

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

{

int v[NMAX+1]; /* стек с номерами вершин текущего пути */

int k; /* указатель стека v */

int j; /* номер строки матрицы смежности */

int vn; /* номер очередной вершины текущего пути */

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

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

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

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

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

do

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

j = v[k-1];

for (vn=v[k]; vn<n && (g[j][vn]==0 || k>1 && vn==v[k-2]); vn++ ) ;

if (vn<n && k<*dcmin) /* можно вперед */

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

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

if (v[0]==v[k] && k>0) /* нашли цикл */

{ *dcmin = k;

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

for (j=0; j<=k; j++) c[j] = v[j];

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

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

}

k++;

} else /* назад */

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

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

}

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

}

return *dcmin > n;

}