Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Пример 20.4

/* Функция ввода графа и формирования векторов смежности */

 

void VectSm (int vsm[NMAX][NMAX+1], int *pn)

/* Вых. данные: vsm – векторы смежности,

*pn – число вершин графа */

{ int i, j; /* номера вершин */

printf (“Введите число вершин:”);

scanf(“%d”, pn);

puts (Введите номера смежных вершин);

for (i = 0; i < *pn: i++)

{ printf (“%d: ”, i);

j = -1;

do scanf(“%d”, &vsm[i][++j]);

while (vsm[i][j]!= -1);

}

}

 

Граф, представленный на рис. 20.5, вводить следует в виде (выделено жирным шрифтом):

Введите число вершин: 4

Введите номера смежных вершин

0: 1 3 -1

1: 0 2 3 -1

2: 1 -1

3: 0 1 -1

 

 

/* Вызов функции */

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

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

VectSm (vsm, &n);

 

В результате выполнения функции получится матрица:

 

| 0 1 2 3 4

--------------------

0 | 1 3 -1

vsm = 1 | 0 2 3 -1

2 | 1 -1

3 | 0 1 -1

 

6. Списки смежности.

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

 

 

Рис. 20.6. Пример графа и списков смежности.

 

 

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

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

/* тип элемента списка */

struct LIST

{ int v; /* вершина */

struct LIST *next; /* ссылка на следующий элемент */

};

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

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

 

Задача 20.1. Дан граф без петель в виде количества вершин n<=7 и матрицы смежности. Сформировать для этого графа матрицу инцидентности.

 

Программа:

 

#include <stdio.h>

#include <conio.h>

#define NMAX 7 /* максимальное число вершин графа */

#define RMAX 21 /* максимальное число ребер */

 

/*---------------------------------------------------------*/

/* функция ввода матрицы смежности */

/*---------------------------------------------------------*/

void VVOD_MATR_SM (int g1 [NMAX][NMAX], int n)

/* Входные данные: n – количество вершин */

/* Выходные данные: g1 – матрица смежности */

{ int i,j; /* параметры циклов */

printf ("Введите матрицу смежности:\n\n");

printf (" ¦ ");

for (j=0; j<n; j++) printf ("%d ",j);

putchar ('\n');

for (i=0; i<2*n+2; i++) putchar ('-');

for (i=0; i<n; i++)

{ printf ("\n%d¦ ",i);

for (j=0; j<n; j++) scanf ("%d", &g1[i][j]);

}

putchar ('\n');

}

 

/*------------------------------------------------------------*/

/* функция вывода матрицы инцидентности */

/*------------------------------------------------------------*/

void VIVOD_MATR_IN (int g2 [NMAX][RMAX], int n, int k)

/* Входные данные: g2 – матрица инцидентности,

n – количество вершин,

k – количество ребер */

{ int i,l; /* параметры циклов */

printf ("Матрица инцидентности\n\n");

printf (" ¦ ");

for (l=0; l<k; l++) printf ("%3d ", l);

putchar ('\n');

for (i=0; i<3*k+2; i++) putchar ('-');

for (i=0; i<n; i++)

{ printf ("\n%d¦ ", i);

for (l=0; l<k; l++)

printf ("%3d ",g2[i][l]);

}

putchar ('\n');

}

/*------------------------------*/

/* главная функция */

/*------------------------------*/

 

void main()

{

int g1 [NMAX][NMAX], /* матрица смежности */

g2 [NMAX][RMAX] = {0}, /* м-ца инцидентности */

n, /* количество вершин */

k; /* количество ребер */

int i, j; /* индексы элементов матриц g1,g2 */

printf ("\nВведите количество вершин:");

scanf ("%d", &n);

VVOD_MATR_SM (g1, n); /* ввод матрицы смежности g1 */

/* Формировавание матрицы инц-ти g2 */

k=0;

for (i=0; i<n; i++)

for (j=i; j<n; j++)

if (g1[i][j])

{ g2[i][k]=1;

g2[j][k]=1;

k++;

}

VIVOD_MATR_IN (g2, n, k); /* вывод м-цы g2 */

getch();

}

 

 

Тесты

1. Исходные данные: Ожидаемый результат:

 

n=4 матрица смежности матрица инцидентности

 

¦ 0 1 2 3 ¦ 0 1 2 3 4

0 1 2 ---------- ------------

0 0¦ 0 1 0 1 0¦ 1 1 0 0 0

3 1¦ 1 0 1 1 1¦ 1 0 1 1 0

1 4 2¦ 0 1 0 1 2¦ 0 0 1 0 1

3¦ 1 1 1 0 3¦ 0 1 0 1 1

 

2. Граф, изображенный на рис. 20.1а. n=NMAX=7. Вид матрицы смежности приведен на рис. 20.2а. Ожидаемый результат: матрица инцидентности, приведенная на рис. 20.2б.

 

3. Полный граф (все вершины смежны между собой), число вершин максимальное.

 

Исходные данные:

 

n=7,

матрица смежности:

¦ 0 1 2 3 4 5 6

----------------

0¦ 0 1 1 1 1 1 1

1¦ 1 0 1 1 1 1 1

2¦ 1 1 0 1 1 1 1

3¦ 1 1 1 0 1 1 1

4¦ 1 1 1 1 0 1 1

5¦ 1 1 1 1 1 0 1

6¦ 1 1 1 1 1 1 0

 

Ожидаемый результат:

 

матрица инцидентности:

 

¦ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

-----------------------------------------------------------------

0¦ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

1¦ 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0

2¦ 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0

3¦ 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0

4¦ 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0

5¦ 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1

6¦ 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1

 

 

4. В графе нет ребер.

 

Исходные данные: Ожидаемый результат:

n=3 м-ца смежности м-ца инцидентности

¦ 0 1 2 ¦

-------- --

0¦ 0 0 0 0¦

1¦ 0 0 0 1¦

2¦ 0 0 0 2¦

 

Контрольные вопросы и упражнения

1. Что такое граф? Нарисуйте какой-нибудь неориентированный граф. Есть ли в этом графе циклы?

2. Приведите пример орграфа. Определите степень этого орграфа и степень каждой его вершины.

3. Что такое путь между двумя вершинами графа? Какой граф является связным?

4. Какой граф называется размеченным и какой – взвешенным?

5. Нарисуйте матрицу смежности для орграфа на рис. 20.1.в. Как по матрице смежности определить преемников и предшественников заданной вершины?

6. Дан орграф в виде матрицы смежности и количества вершин. Опишите функцию определения степени заданной вершины. Приведите пример вызова этой функции.

7. Дан граф в виде матрицы смежности и количества вершин. Опишите функцию вывода номеров вершин со степенью 4. Приведите пример вызова этой функции.

8. Нарисуйте матрицу инцидентности для графа на рис. 20.1.а. Как по матрице инцидентности определить степень каждой вершины и степень графа?

9. Дан орграф в виде матрицы инцидентности, числа вершин и числа ребер. Опишите функцию вывода номеров вершин, имеющих петли. Приведите пример вызова этой функции.

10. Дан орграф в виде матрицы инцидентности, числа вершин и числа ребер. Опишите функцию вывода числа предшественников каждой вершины. Приведите пример вызова этой функции.

 

<== предыдущая лекция | следующая лекция ==>
Пример 20.3 | Пентозы
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 443; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.034 сек.