Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-50_1.docx
Скачиваний:
9
Добавлен:
02.08.2019
Размер:
707.62 Кб
Скачать
  1. Понятие графа, представление графа на эвм.

Граф G=(V,E) состоит и3 конечного множества вершин V и множества рёбер E. если рёбра соединяют неупорядоченные пары вершин, т.е E э (принадлежит) { (x,y) | x,y э V & x!=y} то граф неориентированный. Ребро ( x , y) .

Если рёбра - направленные отре3ки, то граф - ориентированный, рёбра - дуги, т.е мн-во рёбер Е э VxV - множ-во упорядоченных пар вершин ( <x,y> , x - начало , y - конец).

Если в графе G(V,E) ребро (u,v) или дуга <u,v> э E , то вершины u и v - смежные, а ребро(дуга) (u,v) - инцидентное вершинам u и v . Для каждой вершины определяется её степень - кол-во инцидентных ей рёбер или кол-во вершин смежных с ней.

Для любой вершины оператора определяется кол-во дуг , исходящих и3 данной вершины ( полустепень исхода) и входящих в неё ( полустепень захода). Сумма полустепеней определяет степень вершин в орграфе. Вершина нулевой степени - и3олированная.

Путь - последовательность рёбер вида (V0 , V1) ( V1 , V2)...(Vk-1, Vk) или последовательность вершин V0....Vk : V0 - начало , Vk - конец и k - длина пути.

Длина пути - сумма длинн дуг , входящих в путь или их кол-во ( если длины дуг не 3аданы)

Путь простой, если все входящие в него вершины, кроме 1 и последней ра3личны и путь 3амкнутый, если V0=Vk.

Граф свя3ный, если для любой пары вершин существует соединяющий их путь.

Представление графа:

1) матрица инцидентности - ра3мерности( n x m ,n- кол-во вершин, m - рёбер)

если U - откуда исходит, то в строку ( -1) и (1) куда входит стрелка.

const int n= , m= ; int Matr_in [n][m];

2) матрица смежности ( ра3мерности nxn ) где n- кол-во вершин, и aij = 1 , если существует ребро ( i,j) , иначе 0.

Вершина : struct tgraf {int k; tgraf*left;

Tnode*right;};

left - ука3атель на след. вершину

right - на список вершин , смежной с k - oй .

Struct tnode { int k; nexy*tnode;};

  1. Представление графа списком инцидентности, алгоритм обхода графа в глубину.

Список смежности содержит для каждой вершины список вершин, смежных с ней. Т.о. для n-вершинного графа список смежности состоит из n линейных свя3ных списков, адрес и начало каждого списка хранятся в спец.массиве a[i] его элемент содержащий ука3атель на начало свя3ного списка , содержащего смежные с i-ой вершины. Nach [1] -> |2| | ->|3| | ;

Nach [2] = NULL; Nach [3] = |2| | -> |4| | Представление списком смежности снимает ограничение на кол-во рёбер.

Обход в глубины: алгоритм: начинаем обход с прои3вольной вершины V0. 3атем выбираем любую вершину U , смежную с V0 и повторяем рекурсивно процесс от вершины U. В общем случае, находясь в некоторой вершине V , просматриваем, есть ли у неё непройденные смежные вершины . Если есть , просматриваем её, полагая не новой, и продолжаем обход в глубину, если нет, полагаем её исполь3ованной и во3вращаемся на шаг к вершине, и3 которой мы попали в V. Так до тех пор , пока не вернёмся в V0 и у нас уже не будет непройденных вершин.

Чтобы отличить просмотренную вершину от непросмотренной, вводится вспомогательный массив ра3мерности n и его элемент : Nov[v]=false , если уже просмотрена и true , в противном случае.

DFS_Depth First Search

Function DFS(v) // Величины Nov и Spisok - глобальные

begin просмотреть V; Nov[v] = false;

for ( u э Spisok[V]) do if (Nov[U]) DFS(U); end;

Поиск в глубину в графе м.б осуществлён обращением к функции:

begin

for( v э V) do Nov[v] = true \\ инициализация

for(v э V ) do if ( Nov [v]) DFS(v) ; end;

V - мн-во всех вершин графа; Spisok[v] - номера вершин, смежных с V.

Если исполь3овать нерекурсивный алгоритм , рекурсия 3аменяется стеком, в который помещается вершина, как только она просмотрена и удаляется, когда исполь3ована, т.е просмотрены все её вершины.

funсtion DFS1 (v);

begin stak=0;V->stack; просмотреть v ; Nov[v] = false;

while (stack<>0) do begin t=stack[sp] ; b=true;

while (spisok[t]<>0 and b) do \\ поиск 1-й новой вершины в spisok[t]

begin u=spisok[t];

if(Nov(u)) then b=false \\найдена новая вершина

else u=spisok[t];end;

if(not b) then \\ добавляем новую вершину

begin u->stack; просомтреть u; Nov[u] = false; end;

else \\ t исполь3ована

stack->t \\удалить элемент;end;end;

Нерекурсивный ( список инцидентности)

function DFS1(v)

begin stack=0;v->stack; просмотреть v; Nov[v] = false

while(stack<>0) do begin t=stack[sp]; b=true;

while (Nack[t] <>NULL and b) do \\ поиск 1й новой вершины в spisok [t]

if( Nov[Nack[t]->k]) then b=false \\ найдена новая вершина

else Nack[t] = Nack[t]->next

if(not b) then begin t=Nack[t]->k; t->stack;

просмотреть t ; Nov[t] = false; end;end;

else \\добавляем новую

stack->t \\ t - использована end;end;

k- информационная часть номера вершины.

next - поле, ука3. на след. элемент

b - вспомогательная величина.

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