Автор: Пользователь скрыл имя, 18 Октября 2011 в 22:56, лабораторная работа
обхід графа методом пошуку в глибину
Мета
: здійснити обхід графа методом пошуку
в глибину
Теоретичні відомості
Існує багато алгоритмів на графах які ґрунтуються на переборах їх вершин або обходів вершин під час якого кожна вершина має свій унікальний порядковий номер.
Алгоритм обходу графа називається методом пошуку графа.
Пошук в глиб
Нехай простий зв’язний граф усі вершини якого позначені попарно різними символами у процесі пошуку у глиб вершину графа надають номер ) та певним способом позначають ребра.
У вході роботи алгоритму використовують структуру даних збереження вершин яку називають стеком. Зі стеку можна вилучити тільки той елемент котрий було додано останнім.
Додавання і вилучення елементів у стеку відбувається з одного кінця який називається верхівкою стеку.
Виконання роботи
Дано
простий зв’язний граф
|
||||||
Пошук в глиб
Вершина | DFS-номер | Вміст стеку |
a | 1 | a |
b | 2 | ab |
c | 3 | abc |
d | 4 | abcd |
- | - | abc |
- | - | ab |
e | 5 | abe |
f | 6 | abef |
g | 7 | abefg |
- | - | abef |
- | - | abe |
h | 8 | abeh |
- | - | abe |
i | 9 | abei |
- | - | abe |
- | - | ab |
- | - | a |
- | - | ᴓ |
Приклад програми:
#include <stdio.h>
#include <memory.h>
#define MAX 100
int m[MAX][MAX], used[MAX];
int i, n, a, b, ptr;
void dfs(int v){
int i; used[v] = 1;
printf("Vertex %d is visited\n",v);
for(i = 0; i < n; i++)
if (m[v][i] && !used[i]) dfs(i);
printf("Returned to %d",v); }
int main(void){
memset(m,0,sizeof(m)); memset(used,0,sizeof(used));
scanf("%d",&n); for(i = 0; i < n; i++) {
printf("input a, b:");
scanf("%d %d",&a,&b);
m[a][b] = m[b][a] = 1; }
dfs(0);
return 0;
}
Результат програми:
Висновок: під час виконання роботи
здійснила обхід
графа методом пошуку в глибину