Лекции 11-12.ppt
- Количество слайдов: 30
Программирование на языке высокого уровня 2012 г. Лекции 11 -12 Графы КГТУ (КАИ), кафедра АСОИУ 1
Программирование на языке высокого уровня 2012 г. Графы • Граф – это множество вершин и соединяющих их ребер. • Примеры графов: КГТУ (КАИ), кафедра АСОИУ 2
Программирование на языке высокого уровня 2012 г. • В ориентированном графе ребра имеют направление и называются дугами. Если есть дуга v 1 –> v 2 (от вершины v 1 к вершине v 2), то вершина v 1 называется предшественником вершины v 2, а вершина v 2 – преемником вершины v 1. • Вершины, соединенные ребром или дугой, называют смежными. Ребра (дуги), имеющие общую вершину, также называют смежными. КГТУ (КАИ), кафедра АСОИУ 3
Программирование на языке высокого уровня 2012 г. • Ребро (дуга) и любая из его двух вершин называются инцидентными. Степень вершины – это количество инцидентных ей ребер (дуг). • Степень графа – это максимальная степень его вершин. • Ребро (дуга), соединяющее вершину с ней самой, называют петлей. КГТУ (КАИ), кафедра АСОИУ 4
Программирование на языке высокого уровня 2012 г. • Путь – это последовательность вершин, в которой каждая вершина соединена ребром или дугой со следующей вершиной. Длина пути равна количеству его ребер (дуг). Например, в графе на рис а) между вершинами 0 и 3 есть три пути: • 0 – 1 – 3 (длина 2), • 0 – 1 – 4 – 3 (длина 3), • 0 – 5 – 3 (длина 2). КГТУ (КАИ), кафедра АСОИУ 5
Программирование на языке высокого уровня 2012 г. • Замкнутый путь, в котором все ребра (дуги) различны, называют циклом. На рис. а) три цикла: • 0– 1– 3– 5– 0, • 0– 1– 4– 3– 5– 0, • 1– 3– 4– 1. • У взвешенного графа каждое ребро (дуга) имеет вес – числовую или символьную характеристику. У размеченного графа каждой вершине соответствует некоторая информация – метка. КГТУ (КАИ), кафедра АСОИУ 6
Программирование на языке высокого уровня 2012 г. Примеры графов: • Схема алгоритма – размеченный орграф, где вершинами являются блоки алгоритма, а дугами – линии передачи управления. • Система дорог – взвешенный размеченный граф, где вершины – города, а ребра – дороги между городами. Вес ребра – длина дороги, метка вершины – название города. Если дороги односторонние, то граф – ориентированный. КГТУ (КАИ), кафедра АСОИУ 7
Программирование на языке высокого уровня 2012 г. Представление графов • 1. Последовательность ребер (дуг), перед которой указывается количество вершин графа. Каждое ребро (дуга) задается парой смежных вершин. Такая форма удобна для внешнего представления графа при его вводе. • Пример: 5 0 1 2 2 3 4 4 - число вершин 1 2 3 4 4 0 2 КГТУ (КАИ), кафедра АСОИУ 8
Программирование на языке высокого уровня 2012 г. • Если в таком виде хранить граф в памяти, нужно описать два параллельных массива для хранения смежных вершин. • Например: #define int int NMAX 10 RMAX 100 // макс. число вершин // макс. число ребер (дуг) v 1 [RMAX]; /* массивы смежных */ v 2 [RMAX]; /* вершин */ n; // число вершин графа r; // число ребер (дуг) графа КГТУ (КАИ), кафедра АСОИУ 9
Программирование на языке высокого уровня 2012 г. • 2. Матрица смежности – это квадратная матрица размера n*n (n – число вершин), в которой элемент 1, если есть дуга i –> j , ms[i][j] = 0 в противном случае. • Пример матрицы смежности для орграфа, представленного на следующем рисунке: |01234 --------0|01000 1|00100 2|00011 3|00001 4|10100 КГТУ (КАИ), кафедра АСОИУ 10
Программирование на языке высокого уровня 2012 г. • Пример ввода ориентированного графа в виде последовательности дуг и формирования матрицы смежности. #define NMAX 10 // макс. число вершин /* Функция ввода графа */ int Vvod. Graf ( int ms [NMAX] ) // ms – матрица смежности // Возвращаемое значение – число вершин графа { int n; // число вершин графа int i, j; // номера вершин puts (“n. Введите число вершин графа (<=10)”); scanf (“%d”, &n); КГТУ (КАИ), кафедра АСОИУ 11
Программирование на языке высокого уровня 2012 г. // Обнуление матрицы смежности for (i=0; i
Программирование на языке высокого уровня 2012 г. /* Главная функция */ void main() { int g[NMAX][ NMAX] ; // матрица смежности int n; // число вершин графа … n = Vvod. Graf (g); // вызов ф-ции ввода графа … } КГТУ (КАИ), кафедра АСОИУ 13
Программирование на языке высокого уровня 2012 г. Пример функции вывода количества преемников каждой вершины орграфа по его матрице смежности void Kol. Preem ( int ms [NMAX], int n ) // ms – матрица смежности // n – число вершин графа { int i, j; /* индексы строки и столбца м-цы смежности */ int kp; /* кол-во преемников очередной вершины */ КГТУ (КАИ), кафедра АСОИУ 14
Программирование на языке высокого уровня 2012 г. puts (“Вершина Число преемников”); for (i=0; i
Программирование на языке высокого уровня • 3. Матрица весов – квадратная матрица размера n*n (n – число вершин), в которой элемент mw [i][j] = вес дуги i –> j • Например, дана система дорог: вершины – города, ребра – дороги. Вес ребра – длина дороги. КГТУ (КАИ), кафедра АСОИУ 16
Программирование на языке высокого уровня • Описание на языке С: #define NMAX 10 // макс. число вершин int mw [NMAX] ; // матрица весов int n; // число вершин КГТУ (КАИ), кафедра АСОИУ 17
Программирование на языке высокого уровня • 4. Матрица инцидентности – это прямоугольная матрица размера n*r (n – число вершин, r – число ребер). • Для неориентированного графа элемент матрицы: mi 1, если i-я вершина инцидентна j-му ребру, [i][j] = 2, если j-е ребро – петля i-й вершины, 0, если i-я вершина не инцидентна j-му ребру. КГТУ (КАИ), кафедра АСОИУ 18
Программирование на языке высокого уровня • Для орграфа элемент матрицы инцидентности: -1, если j-я дуга выходит из i-й вершины mi[i][j] = 1, если j-я дуга входит в i-ю вершину 2, если j-я дуга – петля i-й вершины, 0, если i-я вершина не инцидентна j-й дуге. . КГТУ (КАИ), кафедра АСОИУ 19
Программирование на языке высокого уровня • Описание на языке С: #define NMAX 10 RMAX 100 // макс. число вершин // макс. число ребер (дуг) int mi[NMAX][ RMAX]; // м-ца инцидентности int n; // число вершин int r; //число ребер (дуг) КГТУ (КАИ), кафедра АСОИУ 20
Программирование на языке высокого уровня Пример функции вывода матрицы инцидентности: void Vivod. Matr. In (int mi[NMAX][RMAX], int n, int r) { int i, j; printf (“ |”); for (j=0; j
Программирование на языке высокого уровня Пример функции вывода количества преемников каждой вершины орграфа по его матрице инцидентности. void Kol. Preem (int mi[NMAX][RMAX], int n, int r) { int i, j; /* индексы строки и столбца м-цы инцидентности */ int kp; /* кол-во преемников очередной вершины */ puts (“Вершина Число преемников”); . КГТУ (КАИ), кафедра АСОИУ 22
Программирование на языке высокого уровня for (i=0; i
Программирование на языке высокого уровня Представление графов (продолжение) • 5. Векторы смежности. • Для каждой вершины в векторе хранятся номера смежных с ней вершин. Векторы смежности: КГТУ (КАИ), кафедра АСОИУ 24
Программирование на языке высокого уровня • Описание на языке С: • #define NMAX 10 // макс. число вершин int vsm[NMAX][ NMAX+1]; // векторы смежности int n; // число вершин • Число столбцов матрицы vsm равно NMAX+1, так как последовательность смежных вершин в каждой строке матрицы удобно хранить с признаком конца, например -1. • vsm [i] – вектор смежности для i-й вершины. КГТУ (КАИ), кафедра АСОИУ 25
Программирование на языке высокого уровня • Эта форма представления графа может быть использована и для ввода графа. • Пример. Введите число вершин: 4 Введите номера смежных вершин 0: 1 3 -1 1: 0 2 3 -1 2: 1 -1 3: 0 1 -1 КГТУ (КАИ), кафедра АСОИУ 26
Программирование на языке высокого уровня // Функция ввода графа и формирования векторов смежности void Vect. Sm (int vsm[NMAX][NMAX+1], int &n) /* Вых. данные: vsm – векторы смежности, n – число вершин графа */ { int i, j; /* номера вершин */ printf (“Введите число вершин: ”); scanf(“%d”, &n); puts (“Введите номера смежных вершин”); for (i = 0; i < n; i++) { printf (“%d: ”, i); j = -1; do scanf(“%d”, &vsm[i][++j]); while (vsm[i][j] != -1); } } КГТУ (КАИ), кафедра АСОИУ 27
Программирование на языке высокого уровня /* Вызов функции */ int vsm[NMAX][ NMAX+1]; // векторы смежности int n; // число вершин Vect. Sm ( vsm, n); • В результате выполнения функции получится матрица: | 0 1 2 3 4 ------------------- 0| vsm = 1 | 2| 3| 1 3 -1 0 2 3 -1 1 -1 0 1 -1 КГТУ (КАИ), кафедра АСОИУ 28
Программирование на языке высокого уровня • 6. Списки смежности. • Для каждой вершины смежных с ней вершин. хранится КГТУ (КАИ), кафедра АСОИУ список 29
Программирование на языке высокого уровня • Описание на языке С: #define NMAX 10 // макс. число вершин // тип элемента списка struct LIST { int v; // вершина struct LIST *next; /* ссылка на следующий элемент */ }; struct LIST *p [NMAX]; /* массив указателей списков смежности */ int n; // число вершин КГТУ (КАИ), кафедра АСОИУ 30


