Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технологии Программирования. 9 лекция

.pdf
Скачиваний:
14
Добавлен:
27.05.2015
Размер:
464.03 Кб
Скачать
//читаем количество вершин из файла

Пример 2 (список смежности)

#include <fstream.h>

main()

{ int **Graf, i, j, N, pos; istream input(” Gtaf.dat”); input>>N;

/* Открываем файл для чтения */

// выделяет динам. память для списка смежности

Graf=new int *[N]; for(i=0;i<N;i++) Graf[i]=new int [2];

// обнуляем все элементы списка

for(i=0;i<N;i++) for(j=0;j<N;j++) Graf[i][j]=0; pos=0;

while(! input.eof() )

{input>>i>>j; Graf[0][pos]=i; Graf[1][pos]=j; pos++;} return 0;

}

// записать все значения индексов

3. Представление ориентированного графа.

Опр. Орграф или ориентированный граф – граф, для которого пара (i,j) задается однозначно, связь между

вершинами однонаправленная вершина i соединена

дугой с j, а не j соединена с i.

Если граф ориентирован, то пары элементов

из множества VG называются

не ребрами, а дугами.

 

На рис. 4 вершина 1 соединена ребром

Рис. 4 Орграф.

с вершиной 2, поэтому дуга (1,2) изображается

 

направленной линией из 1 в 2.

 

Если дуга соединяет некоторую вершину с собой, то

она называется петлей.

Представление орграфа в памяти ПК

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

список смежности

А) представление графа (рис.5 )

при помощи матрицы смежности

В данном графе 6 вершин и 7 ребер.

Чтобы задать граф матрицей смежности, Рис. 5

необходима матрица 6x6

 

0

1

2

3

4

5

 

 

 

 

 

 

 

0

0

0

1

0

0

1

 

 

 

 

 

 

 

1

0

0

1

0

0

1

 

 

 

 

 

 

 

2

0

0

0

0

1

1

 

 

 

 

 

 

 

3

0

0

1

0

0

0

 

 

 

 

 

 

 

4

0

0

1

0

0

0

 

 

 

 

 

 

 

5

0

0

0

0

0

0

 

 

 

 

 

 

 

Код программы – представление орграфа в виде матрицы смежности

int main()

{int Graf[100][100],I,j,N;

//читаем из файла количество вершин в графе ifstream input(“graf.txt”); input>>N;

//выделяем динамическую память для матрицы смежности

Graf= new int *[N];

for(i=0;i<N;i++) {Graf[i]= new int [N];}

//обнуляем все элементы

for(i=0;i<N;i++) for(j=0;j<N;j++) Graf[i][j]=0; while (! input,eof())

{input>>i>>j; Graf[i][j]=1;} // записать все значения индексов return 0;

}

представление орграфа в виде списка смежности - самостоятельно

4. АЛГОРИТМЫ на графах

(ОБХОДЫ графов)

Многие алгоритмы на графах основаны на систематическом переборе всех вершин графа, при котором каждая вершина просматривается в точности один раз.

Здесь мы рассмотрим два стандартных и широко используемых

метода такого перебора: поиск в глубину и поиск в ширину.

4.1. Поиск в ширину.

рис.6.

 

Рассмотрим действие данного алгоритма на примере графа G, изображенного на

рис.6.

Так как алгоритм некоторым образом помечает вершины, то на 1-ом шаге

сделаем метки всех вершин нулевыми

1) Выбираем стартовую вершину поиска.

Пусть V=0. Каждой вершине из окружения вершины V=0 присвоим метку 1 (Рис.7)

Примечание. Присваивание происходит только в

том случае, если вершина не помечена.

Таким образом, вершины V=3 и V=4

получили метку 1.

Рис. 7. Шаг 2

2) Теперь рассмотрим поочередно окружение всех вершин с меткой 1 и каждой вершине из этого окружения присвоим метку

2 (Рис.8)

Таким образом, вершины V=2,1 и 5 получили метку 2.

Рис. 8. Шаг 3 алгоритма поиска в ширину

3) Далее рассматриваем окружение вершин V=2,1 и 5. Алгоритм не находит ни одной непомеченной вершины. Это означает, что поиск в ширину закончен, и вершины получили свои метки.

Замечание. Процесс расстановки меток можно рассматривать как

процесс распространения волны. Поэтому часто поиск в ширину

называют волновым алгоритмом.

4) После того как все вершины получили свои метки, можно

определить расстояние от стартовой вершины до любой другой.

Это расстояние равно метке вершины, до которой нам необходимо дойти.

Например,

расстояние от V= 0 до V=3 равно 1, расстояние от V= 0 до V=5 равно 2 и т.д.

Компьютерная реализация (матрица смежности)

 

 

0

1

2

3

4

5

 

 

0

0

0

0

1

1

0

 

 

 

 

 

 

 

 

 

 

 

1

0

0

1

0

1

0

 

 

 

 

 

 

 

 

 

 

 

2

0

1

0

1

1

1

 

 

 

 

 

 

 

 

 

 

 

3

1

0

1

0

0

0

 

 

 

 

 

 

 

 

 

 

 

4

1

1

1

0

0

1

 

 

 

 

 

 

 

 

 

 

 

5

0

0

1

0

1

0

 

Для каждой вершины зарезервируем в массиве Label ячейку, в которую будет помещена метка данной вершины.

Выше на 1-ом шаге всем вершинам были присвоены метки =0.

Однако при реализации на ПК в самом начале алгоритма N

ячеек массива заполним большим числом, например 32767, чтобы затем удобнее было производить сравнение.

Label

Создание массива меток перед началом волнового алгоритма.

Индекс

0

1

2

3

4

5

 

 

 

 

 

 

 

Элемент

32767

32767

32767

32767

32767

32767

На каждом шаге последовательно создаем очередь вершин, имеющих метки 1,2,3 и т.д.