Professional Documents
Culture Documents
Lecture10 Graph
Lecture10 Graph
A H I
Граф
J K
свойства.
Ребро е връзка между два върха.
F
Граф с върхове A B C D E F G H I J K L M
и множество от ребра
AG AB AC LM JM JL JK ED FD HI FE AF GE
Приложение
Път от връх x до връх y е списък от възлите,
– карта на транспортни пътища – маршрути които са свързани чрез ребра в графа.
(връзки) между градовете (върхове): най-
бързият път от София до Лондон със самолет, Пример: Път от B до G е списъкът BAFEG.
най-евтиният път от София до Лондон със Свързан граф е граф, в който има път от всеки
самолет; възел до всеки друг възел в графа.
– електрически схеми – свързване с проводници Несвързан граф е изграден от свързани
на елементите (транзистори, резистори, компоненти.
кондензатори и т.н.): свързани ли са всички
елементи в схемата, работоспособност на Пример: Графът е изграден от три свързани
схемата; компоненти.
Съединение на елементи от тип ЦЯЛО, #define MAXV <константа> // максимален брой върхове
образуващи матрица на съседство с V върха и Е struct graph // ГРАФ
ребра. {
тип ГРАФ = (V: ЦЯЛО; {брой върхове} int V; // брой върхове
E: ЦЯЛО; {брой ребра} int E; // брой ребра
масив adjmatrix[1:MAXV][1:MAXV]: ЦЯЛО) int adjmatrix[MAXV][MAXV]; // матрица на съседство
};
typedef struct graph GRAPH;
Операции
Характеристики
1. Създаване на граф
1. Представянето чрез матрица на съседство е
подходящо за плътни графи – матрицата 2. Обхождане на граф в дълбочина
изисква V2 елемента памет и V2 стъпки само
за инициализация.
2. Имената на върховете се представят чрез
цели числа между 1 и V – бърз достъп до
информацията във всеки възел. Използваме
1-буквени имена на върховете, като iтата
буква от азбуката съответства на цялото
число i.
посещение на връх k
val[k] ← ПОСЕТЕН
печат на името на посетения възел Обхождане на граф в дълбочина
за t от 1 до V повтаряй при следната последователност от въвеждане на
ако adjmatrix[k][t] != 0 ребрата:
ако val[t] e НЕПОСЕТЕН AG AB AC LM JM JL JK ED FD HI FE AF GE.
посети връх t
Операции
Характеристики
1. Създаване на граф
1. Представянето чрез структура на съседство е
подходящо за разредени графи – 2. Обхождане на граф в дълбочина
необходимото пространство е О(V+E) за ─ рекурсивен вариант
разлика от О(V2), необходимо за
представянето чрез матрица на съседство. ─ нерекурсивен вариант
3. Обхождане на граф в ширина
2. Всяко ребро се представя два пъти отново –
ребро между върховете i и j се представя като
връх, съдържащ i в списъка на съседство на j
и като връх, съдържащ j в списъка на
съседство на i.
3. Важен е редът, в който се въвеждат ребрата.
ГРАФ
1. Създаване на граф GRAPH create()
{ GRAPH g;
Алгоритъм int i, j, k;
въведи V и E
char v1, v2;
за i от 1 до V повтаряй
adj[i] ← ПРАЗНО LINK t;
за k от 1 до E повтаряй printf ("Въведи брой върхове = ");
въведи символвръх1 и символвръх2 scanf ("%d", &g.V);
i ← конвертиран символвръх1 в ЦЯЛО printf ("Въведи брой ребра = ");
j ← конвертиран символвръх2 в ЦЯЛО scanf ("%d", &g.E);
t ← нов връх for (i=1; i<=g.V; i++)
данниt ← i g.adj[i] = NULL;
следващt ← adj[j] for (k=1; k<=g.E; k++)
adj[j] ← t {
t ← нов връх printf ("Въведи ребро:\n");
данниt ← j
printf ("Връх 1: ");
следващt ← adj[i]
fflush (stdin);
adj[i] ← t
v1 = getchar();
Алгоритъм
Алгоритъм за i от 1 до V повтаряй
за i от 1 до V повтаряй отпечатай името на връх i
отпечатай името на връх i докато adj[i] e различно от ПРАЗНО повтаряй
за i от 1 до V повтаряй отпечатай името на върха в adj[i]
отпечатай името на връх i t ← следващия елемент на adj[i]
за j от 1 до V повтаряй adj[i] ← t
отпечатай admatrix[i][j]