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

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

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

П.1.

В качестве начальной (стартовой) вершины возьмем вершину V= 0 ( с нее начинаем обход).

(В качестве стартовой можно взять любую вершину)

После того, как мы объявили вершину V= 0 стартовой, она заносится в очередь и получает метку =0.

Создание очереди на 1-ом шаге волнового алгоритма.

Индекс

0

1

2

3

4

 

5

 

 

 

 

 

 

 

 

 

 

Элемент

0

-

-

-

-

 

-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Массив меток на 1-ом шаге волнового алгоритма.

 

 

 

 

 

 

 

 

 

 

Индекс

0

1

2

3

4

 

5

 

 

 

 

 

 

 

 

 

 

Элемент

0

32767

32767

32767

32767

 

32767

 

 

 

 

 

 

 

 

 

 

П.2. Далее просматриваем нулевую строку матрицы смежности

A[0][i].

Если некоторый элементA[0][i] не равен 0, то I помещается в очередь.

В нашем случае вершины 3 и 4 будут занесены в очередь и помечены меткой 1.

 

 

 

 

Очередь на 2-ом шаге волнового алгоритма.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Индекс

0

1

2

3

4

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Элемент

0

3

4

-

-

-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Массив меток на 2-ом шаге волновогоалгоритма.

 

 

 

 

 

 

 

 

 

 

 

 

 

Индекс

 

0

 

1

 

2

 

3

 

4

 

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Элемент

 

0

 

32767

 

32767

 

1

 

1

 

32767

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

После данных действий вершина V=0 будет удалена из очереди путем перемещения указателя начала очереди на один элемент вправо.

П.3.

Далее рассматриваем окружение вершин 3 и 4, т.е. поочередно

просматриваем 4-ую и 5-ую строки матрицы смежности. Если некоторый элементA[3][i] не равен 0, то i помещается в очередь.

В нашем случае вершина 2 будет занесена в очередь и получит

метку 2.

Очередь на 3-ом шаге волнового алгоритма.

Индекс

0

1

2

3

4

5

 

 

 

 

 

 

 

Элемент

0

3

4

2

-

-

 

 

 

 

 

 

 

 

 

 

 

 

Массив меток на 3-ом шаге волнового алгоритма.

 

 

 

 

 

 

 

Индекс

0

1

2

3

4

5

 

 

 

 

 

 

 

Элемент

0

32767

2

1

1

32767

 

 

 

 

 

 

 

После данных действий вершина V=3 будет удалена из очереди путем

перемещения указателя начала очереди на один элемент вправо

П.4.

Аналогично рассматриваем элемент элементы матрицы смежностиA[4][i].

Записать действия самостоятельно и заполнить таблицы для очереди и массива меток на 4-м шаге.

П.5.

Рассматривая окружение вершин 1 и 5, не находим ни одной непомеченной вершины, следовательно, вершины последовательно удаляются из очереди.

Очередь пуста. Поиск закончен.

Код программы int i,j,k,p,cur; int Start, N, M; int main()

{int **Graf; // объявляем матрицу смежности int *Label; // объявляем массив меток

int *FIFO; // объявляем СД очередь

//открываем файл для чтения ifstream input(“graf.txt”);

input>>N>>M>>Start; // читаем из файла

//количество вершин в графе N

//количество ребер в графе M

//Start – стартовая вершина обхода

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

Label= new int [N];

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

FIFO= new int [N];

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

Graf= new int * [N];

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

/*==============================

Последовательно читаем из файла очередные две смежные вершины и помечаем в матрице, что они соединены ребром

*/

for(k=0;k<M;k++)

{input>>i>>j; // читаем номера смежных вершин Graf[i][j]=1; // матрица смежности

}

for(i=0;i<M;i++){FIFO[i]=0;Label[i]=32767;}

//==============================

После этого определяем положение указателей начала и конца очереди

p=0; // указатель на начало очереди k=1; // указатель на конец очереди

// заносим стартовую вершину обхода в очередь

FIFO[p]=Start;Label[Start]=0; // и помечаем ее меткой 0

//==============================

Все промежуточные преобразования выполнены, алгоритм будет работать до тех пор, пока очередь не станет пустой while (p!=k) {

cur=FIFO[p]; // выбираем 1-ый элемент в очереди и p++; // сдвигаем указатель p на единицу вправо

//==============================

Просматриваем строку матрицы с номером cur, то есть с номеров выбранной вершины.

Если нек-рый элемент не равен 0, и вершина, номер к-рой соответствует номеру столбца ненулевого элемента, не помечена, то заносим ее в очередь и помечаем

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

if(Graf[cur][i]==1 && Label[i]>Label[cur]+1) {FIFO[k]=i; // выделяем очередную вершину из очереди k++; // сдвигаем указатель начала на 1

Label[i]=Label[cur]+1; //помечаем вершину

}

}

// вывод результата

for(i=0;i<N;i++) cout<<Label[i]<<” ” ; getch();

return 0;

}