лекция 6

18
1 Лекция 6 Графы

description

 

Transcript of лекция 6

Page 1: лекция 6

1

Лекция 6

Графы

Page 2: лекция 6

2

Граф – это множество вершин и соединяющих их ребер. Примеры графов:

Page 3: лекция 6

3

Примеры графов:

Схема алгоритма – размеченный орграф, где вершинами являются блоки алгоритма, а дугами – линии передачи управления.

Система дорог – взвешенный размеченный граф, где вершины – города, а ребра – дороги между городами. Вес ребра – длина дороги, метка вершины – название города. Если дороги односторонние, то граф – ориентированный.

Page 4: лекция 6

4

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

1. Последовательность ребер (дуг), перед которой указывается количество вершин графа. Каждое ребро (дуга) задается парой смежных вершин. Такая форма удобна для внешнего представления графа при его вводе.

Пример:

5 - число вершин0 11 22 32 43 44 04 2

Page 5: лекция 6

5

Если в таком виде хранить граф в памяти, нужно описать два параллельных массива для хранения смежных вершин.

Например:

#define NMAX 10 /* макс. число вершин */#define RMAX 100 /* макс. число ребер */

int v1 [RMAX]; /* массивы смежных */int v2 [RMAX]; /* вершин */int n; /* число вершин графа */int r; /* число ребер графа */

Page 6: лекция 6

6

2. Матрица смежности – это квадратная матрица размерности n*n (n – число вершин), в которой элемент

ms[i][j] = 1, ли есть дуга i –> j , и = 0 в противном случае.

Пример матрицы смежности для графа, представленного на рис. а):

| 0 1 2 3 4 5--------------------0 | 0 1 0 0 0 1 Для неориентированного графа матрица 1 | 1 0 1 1 1 0 смежности симметрична относительно 2 | 0 1 0 0 0 0 главной диагонали.3 | 0 1 0 0 1 1 4 | 0 1 0 1 0 0 5 | 1 0 0 1 0 0

Page 7: лекция 6

7

Пример ввода неориентированного графа в виде последовательности ребер и формирования матрицы смежности.

#define NMAX 10 /* макс. число вершин *//* Функция ввода графа */

int VvodGraf ( int ms [NMAX] [NMAX] ) /* ms – матрица смежности */ /* Возвращаемое значение – число вершин графа */{ int n; /* число вершин графа */ int i, j; /* номера вершин */ puts (“\nВведите число вершин графа (<=10)”); scanf (“%d”, &n);

Page 8: лекция 6

8

/* Обнуление матрицы смежности */ for (i=0; i<n; i++) for (j=0; j<n; j++) ms[i][j] = 0; puts (“Введите последовательность ребер, завершив ввод ”);

puts (“нажатием Ctrl-Z”); while (scanf(“%d %d”, &i,&j) !=EOF) ms[i][j] = ms[j][i] = 1; return n;}

/* Главная функция */void main(){ int g[NMAX][ NMAX] ; /* матрица смежности */ int n; /* число вершин графа */

… n = VvodGraf (g); /* вызов ф-ции ввода графа */

…}

Page 9: лекция 6

9

3. Матрица весов – квадратная матрица размерности n*n (n – число вершин), в которой элемент

mw [i][j] = вес дуги i –> j Например, дана система дорог: вершины – города, ребра –

дороги. Вес ребра – длина дороги.

Page 10: лекция 6

10

Описание на языке С:

#define NMAX10 /* макс. число вершин */

int mw[NMAX][ NMAX] ; /* матрица весов */

int n; /* число вершин */

Page 11: лекция 6

11

4. Матрица инцидентности – это прямоугольная матрица размерности n*r (n – число вершин, r – число ребер).

Для неориентированного графа элемент матрицы:

1, если i-я вершина инцидентна j-му ребру, mi[i][j] = 2, если j-е ребро – петля i-й вершины,

0, если i-я вершина не инцидентна j-му ребру.

Page 12: лекция 6

12

Для орграфа элемент матрицы инцидентности:

-1, если j-я дуга выходит из i-й вершины mi[i][j] = 1, если j-я дуга входит в i-ю вершину 2, если j-я дуга – петля i-й вершины,

0, если i-я вершина не инцидентна j-й дуге.

Page 13: лекция 6

13

Описание на языке С:

#defineNMAX 10 /* макс. число вершин */

#defineRMAX 100 /* макс. число ребер (дуг) */

int mi[NMAX][ RMAX]; /* м-ца инцидентности */

int n; /* число вершин */

int r; /*число ребер */

Page 14: лекция 6

14

5. Векторы смежности .

Для каждой вершины в векторе хранятся номера смежных с ней вершин.

Векторы смежности:

Page 15: лекция 6

15

Описание на языке С:

#define NMAX 10 /* макс. число вершин */

int vsm[NMAX][ NMAX+1]; /* векторы смежности */

int n; /* число вершин */

Число столбцов матрицы vsm равно NMAX+1, так как последовательность смежных вершин в каждой строке матрицы удобно хранить с признаком конца, например -1. vsm[i] – вектор смежности для i-й вершины.

Page 16: лекция 6

16

Эта форма представления графа может быть использована и для ввода графа.

Пример.Введите число вершин: 4Введите номера смежных вершин0: 1 3 -11: 0 2 3 -12: 1 -13: 0 1 -1

Page 17: лекция 6

17

6. Списки смежности . Для каждой вершины хранится список смежных с ней

вершин.

Page 18: лекция 6

18

Описание на языке С:

#defineNMAX 10 /* макс. число вершин */

/* тип элемента списка */struct LIST{ int v; /* вершина */ struct LIST *next; /* ссылка на следующий

элемент */}struct LIST *p [NMAX]; /* массив указателей списков

смежности */int n; /* число вершин */