Скачать презентацию Программирование на языке высокого уровня 2012 г Лекции Скачать презентацию Программирование на языке высокого уровня 2012 г Лекции

Лекции 11-12.ppt

  • Количество слайдов: 30

Программирование на языке высокого уровня 2012 г. Лекции 11 -12 Графы КГТУ (КАИ), кафедра Программирование на языке высокого уровня 2012 г. Лекции 11 -12 Графы КГТУ (КАИ), кафедра АСОИУ 1

Программирование на языке высокого уровня 2012 г. Графы • Граф – это множество вершин Программирование на языке высокого уровня 2012 г. Графы • Граф – это множество вершин и соединяющих их ребер. • Примеры графов: КГТУ (КАИ), кафедра АСОИУ 2

Программирование на языке высокого уровня 2012 г. • В ориентированном графе ребра имеют направление Программирование на языке высокого уровня 2012 г. • В ориентированном графе ребра имеют направление и называются дугами. Если есть дуга v 1 –> v 2 (от вершины v 1 к вершине v 2), то вершина v 1 называется предшественником вершины v 2, а вершина v 2 – преемником вершины v 1. • Вершины, соединенные ребром или дугой, называют смежными. Ребра (дуги), имеющие общую вершину, также называют смежными. КГТУ (КАИ), кафедра АСОИУ 3

Программирование на языке высокого уровня 2012 г. • Ребро (дуга) и любая из его Программирование на языке высокого уровня 2012 г. • Ребро (дуга) и любая из его двух вершин называются инцидентными. Степень вершины – это количество инцидентных ей ребер (дуг). • Степень графа – это максимальная степень его вершин. • Ребро (дуга), соединяющее вершину с ней самой, называют петлей. КГТУ (КАИ), кафедра АСОИУ 4

Программирование на языке высокого уровня 2012 г. • Путь – это последовательность вершин, в Программирование на языке высокого уровня 2012 г. • Путь – это последовательность вершин, в которой каждая вершина соединена ребром или дугой со следующей вершиной. Длина пути равна количеству его ребер (дуг). Например, в графе на рис а) между вершинами 0 и 3 есть три пути: • 0 – 1 – 3 (длина 2), • 0 – 1 – 4 – 3 (длина 3), • 0 – 5 – 3 (длина 2). КГТУ (КАИ), кафедра АСОИУ 5

Программирование на языке высокого уровня 2012 г. • Замкнутый путь, в котором все ребра Программирование на языке высокого уровня 2012 г. • Замкнутый путь, в котором все ребра (дуги) различны, называют циклом. На рис. а) три цикла: • 0– 1– 3– 5– 0, • 0– 1– 4– 3– 5– 0, • 1– 3– 4– 1. • У взвешенного графа каждое ребро (дуга) имеет вес – числовую или символьную характеристику. У размеченного графа каждой вершине соответствует некоторая информация – метка. КГТУ (КАИ), кафедра АСОИУ 6

Программирование на языке высокого уровня 2012 г. Примеры графов: • Схема алгоритма – размеченный Программирование на языке высокого уровня 2012 г. Примеры графов: • Схема алгоритма – размеченный орграф, где вершинами являются блоки алгоритма, а дугами – линии передачи управления. • Система дорог – взвешенный размеченный граф, где вершины – города, а ребра – дороги между городами. Вес ребра – длина дороги, метка вершины – название города. Если дороги односторонние, то граф – ориентированный. КГТУ (КАИ), кафедра АСОИУ 7

Программирование на языке высокого уровня 2012 г. Представление графов • 1. Последовательность ребер (дуг), Программирование на языке высокого уровня 2012 г. Представление графов • 1. Последовательность ребер (дуг), перед которой указывается количество вершин графа. Каждое ребро (дуга) задается парой смежных вершин. Такая форма удобна для внешнего представления графа при его вводе. • Пример: 5 0 1 2 2 3 4 4 - число вершин 1 2 3 4 4 0 2 КГТУ (КАИ), кафедра АСОИУ 8

Программирование на языке высокого уровня 2012 г. • Если в таком виде хранить граф Программирование на языке высокого уровня 2012 г. • Если в таком виде хранить граф в памяти, нужно описать два параллельных массива для хранения смежных вершин. • Например: #define int int NMAX 10 RMAX 100 // макс. число вершин // макс. число ребер (дуг) v 1 [RMAX]; /* массивы смежных */ v 2 [RMAX]; /* вершин */ n; // число вершин графа r; // число ребер (дуг) графа КГТУ (КАИ), кафедра АСОИУ 9

Программирование на языке высокого уровня 2012 г. • 2. Матрица смежности – это квадратная Программирование на языке высокого уровня 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 г. • Пример ввода ориентированного графа в виде Программирование на языке высокого уровня 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<n; Программирование на языке высокого уровня 2012 г. // Обнуление матрицы смежности for (i=0; i

Программирование на языке высокого уровня 2012 г. /* Главная функция */ void main() { Программирование на языке высокого уровня 2012 г. /* Главная функция */ void main() { int g[NMAX][ NMAX] ; // матрица смежности int n; // число вершин графа … n = Vvod. Graf (g); // вызов ф-ции ввода графа … } КГТУ (КАИ), кафедра АСОИУ 13

Программирование на языке высокого уровня 2012 г. Пример функции вывода количества преемников каждой вершины Программирование на языке высокого уровня 2012 г. Пример функции вывода количества преемников каждой вершины орграфа по его матрице смежности void Kol. Preem ( int ms [NMAX], int n ) // ms – матрица смежности // n – число вершин графа { int i, j; /* индексы строки и столбца м-цы смежности */ int kp; /* кол-во преемников очередной вершины */ КГТУ (КАИ), кафедра АСОИУ 14

Программирование на языке высокого уровня 2012 г. puts (“Вершина Число преемников”); for (i=0; i<n; Программирование на языке высокого уровня 2012 г. puts (“Вершина Число преемников”); for (i=0; i

Программирование на языке высокого уровня • 3. Матрица весов – квадратная матрица размера n*n Программирование на языке высокого уровня • 3. Матрица весов – квадратная матрица размера n*n (n – число вершин), в которой элемент mw [i][j] = вес дуги i –> j • Например, дана система дорог: вершины – города, ребра – дороги. Вес ребра – длина дороги. КГТУ (КАИ), кафедра АСОИУ 16

Программирование на языке высокого уровня • Описание на языке С: #define NMAX 10 // Программирование на языке высокого уровня • Описание на языке С: #define NMAX 10 // макс. число вершин int mw [NMAX] ; // матрица весов int n; // число вершин КГТУ (КАИ), кафедра АСОИУ 17

Программирование на языке высокого уровня • 4. Матрица инцидентности – это прямоугольная матрица размера Программирование на языке высокого уровня • 4. Матрица инцидентности – это прямоугольная матрица размера n*r (n – число вершин, r – число ребер). • Для неориентированного графа элемент матрицы: mi 1, если i-я вершина инцидентна j-му ребру, [i][j] = 2, если j-е ребро – петля i-й вершины, 0, если i-я вершина не инцидентна j-му ребру. КГТУ (КАИ), кафедра АСОИУ 18

Программирование на языке высокого уровня • Для орграфа элемент матрицы инцидентности: -1, если j-я Программирование на языке высокого уровня • Для орграфа элемент матрицы инцидентности: -1, если j-я дуга выходит из i-й вершины mi[i][j] = 1, если j-я дуга входит в i-ю вершину 2, если j-я дуга – петля i-й вершины, 0, если i-я вершина не инцидентна j-й дуге. . КГТУ (КАИ), кафедра АСОИУ 19

Программирование на языке высокого уровня • Описание на языке С: #define NMAX 10 RMAX Программирование на языке высокого уровня • Описание на языке С: #define NMAX 10 RMAX 100 // макс. число вершин // макс. число ребер (дуг) int mi[NMAX][ RMAX]; // м-ца инцидентности int n; // число вершин int r; //число ребер (дуг) КГТУ (КАИ), кафедра АСОИУ 20

Программирование на языке высокого уровня Пример функции вывода матрицы инцидентности: void Vivod. Matr. In Программирование на языке высокого уровня Пример функции вывода матрицы инцидентности: 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<n; i++) { for (kp=0, j=0; j<r; Программирование на языке высокого уровня for (i=0; i

Программирование на языке высокого уровня Представление графов (продолжение) • 5. Векторы смежности. • Для Программирование на языке высокого уровня Представление графов (продолжение) • 5. Векторы смежности. • Для каждой вершины в векторе хранятся номера смежных с ней вершин. Векторы смежности: КГТУ (КАИ), кафедра АСОИУ 24

Программирование на языке высокого уровня • Описание на языке С: • #define NMAX 10 Программирование на языке высокого уровня • Описание на языке С: • #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 Программирование на языке высокого уровня // Функция ввода графа и формирования векторов смежности 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 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. Списки смежности. • Для каждой вершины смежных Программирование на языке высокого уровня • 6. Списки смежности. • Для каждой вершины смежных с ней вершин. хранится КГТУ (КАИ), кафедра АСОИУ список 29

Программирование на языке высокого уровня • Описание на языке С: #define NMAX 10 // Программирование на языке высокого уровня • Описание на языке С: #define NMAX 10 // макс. число вершин // тип элемента списка struct LIST { int v; // вершина struct LIST *next; /* ссылка на следующий элемент */ }; struct LIST *p [NMAX]; /* массив указателей списков смежности */ int n; // число вершин КГТУ (КАИ), кафедра АСОИУ 30