Академический Документы
Профессиональный Документы
Культура Документы
Отчет
по лабораторной работе Nr.1.
по Дискретной математике
Кишинев – 2023
Цель работы:
1. Освоение и изучение способов задания графов: матрица
инцидентности, матрица смежности, список смежности.
2. Разработка процедур преобразования видов хранения графов с
выдачей результатов на дисплей.
Задание
1. Разработать процедуры ввода графа в виде матрицы
инцидентности, матрицы смежности и списка смежности с
возможностью корректировки введенных данных.
2.Разработать процедуры преобразования различных форм
хранения графа:
-- из матрицы смежности в список смежности и обратно;
-- из матрицы инцидентности в список смежности и обратно;
3. Используя указанные выше процедуры, получить
программу, выполняющую следующие функции:
--ввод графа в любой из трех форм представления (по требованию
пользователя);
--хранение введенного графа в памяти ЭВМ в виде списка
смежности;
-- вывод информации о графе в любом из трех видов (также по
требованию пользователя) на дисплей;
Код программы:
#include <stdio.h>
#include <stdlib.h>
}
printf("\n");
}
}
void printAdjacencyList_from_Matrix(int **spisoc_smejnosti, int vershina){
printf("\nСписок смежности:\n");
for (int i = 0; i < vershina; ++i) {
printf("Вершина %d: ", i + 1);
for (int j = 0; j < vershina; ++j) {
if (spisoc_smejnosti[i][j] == 1|| spisoc_smejnosti[i][j]==2 ) {
printf("%d ", j + 1);
}
}
printf("0\n");
}
}
int** AdjacencyList_makeing(int **spisoc_smejnosti, int numEdges) {
int start, end;
return spisoc_smejnosti;
}
void printIncidenceMatrix(int **num, int numEdges, int vershina) {
printf("\nМатрица инцидентности:\n");
for (int i = 0; i < numEdges; ++i) {
for (int j = 0; j < vershina; ++j) {
printf("%d ", num[i][j]);
}
printf("\n");
}
}
int getUserChoice() {
int choice;
printf("Выберите действие:\n");
printf("1. Переход из списка смежности в матрицу смежности\n");
printf("2. Переход из матрицы смежности в список смежности\n");
}
void processDynamicArrayAndPrintIncidenceMatrix(int **spisoc_smejnosti, int
numEdges, int vershina) {
int **num = allocateIncidenceMatrix(numEdges, vershina);
int *dynamicArray = allocateDynamicArray(numEdges);
int k = 0;
int **spisoc_smejnostii = spisoc_smejnosti;
for (int i = 0; i < vershina; ++i) {
for (int j = 0; j < vershina; ++j) {
if (spisoc_smejnostii[i][j] == 1 || spisoc_smejnostii[i][j] == 2)
{
dynamicArray[k] = (i+1) * 10 + (j);
k++;
}
}
}
for (int k = 0; k < numEdges; ++k) {
int i = (dynamicArray[k] / 10)-1;
int j = dynamicArray[k] % 10;
if (spisoc_smejnostii[i][j] == 2) {
num[k][i] = 2;
} else {
num[k][i] = -1;
num[k][j] = 1;
}
}
printf("\nМатрица инцидентности:\n");
for (int i = 0; i < numEdges; ++i) {
for (int j = 0; j < vershina; ++j) {
printf("%d ", num[i][j]);
}
printf("\n");
}
freeDynamicArray(dynamicArray);
}
int** processsDynamicArrayAndReturnIncidenceMatrix(int **spisoc_smejnosti, int
numEdges, int vershina) {
int **num = allocateIncidenceMatrix(numEdges, vershina);
int *dynamicArray = allocateDynamicArray(numEdges);
int k = 0;
int **spisoc_smejnostii = spisoc_smejnosti;
if (spisoc_smejnostii[i][j] == 2) {
num[k][i] = 2;
} else {
num[k][i] = -1;
num[k][j] = 1;
}
}
freeDynamicArray(dynamicArray);
return num;
}
void incidenceMatrixToAdjacencyList(int **num, int vershina,int numEdges) {
int intident_spisoc[vershina][vershina];
for (int i = 0; i < vershina; ++i) {
for (int j = 0; j < vershina; ++j) {
intident_spisoc[i][j] = 0;
}
}
int d = 0;
for (int i = 0; i < numEdges; ++i) {
for (int j = 0; j < vershina; ++j) {
if (num[i][j] == -1) {
d = j;
for (int k = 0; k < vershina; ++k) {
if (num[i][k] == 1) {
intident_spisoc[d][k] = 1;
}
}
} else if (num[i][j] == 2) {
intident_spisoc[j][j] = 1;
}
}
}
int main() {
system("chcp 65001");
int vershina, choice, numEdges, da;
choice = 1;
while (choice != 0) {
printf("Введите количество вершин в графе: ");
scanf("%d", &vershina);
printf("Введите количество рёбер в графе: ");
scanf("%d", &numEdges);
choice = getUserChoice();
int a;
int **spisoc_smejnostii;
spisoc_smejnostii = allocateAdjacencyList(vershina);
spisoc_smejnostii = AdjacencyList_makeing(spisoc_smejnostii,
numEdges);
switch (choice) {
case 1:
processStep1(vershina, spisoc_smejnostii);
printf("Матрица смежности->список смежности-----> 2\n");
scanf("%d", &choice);
if (choice == 2) {
processThirdStep( vershina, spisoc_smejnostii);
}
printf("Введите 1 если хотите изменить ввод ");
scanf("%d", &a);
if (a == 1) {
freeAdjacencyList(spisoc_smejnostii, vershina);
printf("Введите количество вершин в графе: ");
scanf("%d", &vershina);
printf("Введите количество рёбер в графе: ");
scanf("%d", &numEdges);
printf("Список смежности->матрица смежности-----> 1\n ");
scanf("%d", &a);
if (a==1)
{
spisoc_smejnostii = allocateAdjacencyList(vershina);
spisoc_smejnostii =
AdjacencyList_makeing(spisoc_smejnostii, numEdges);
processStep1(vershina, spisoc_smejnostii);
}
printf("Матрица смежности->список смежности-----> 2 \n");
scanf("%d", &choice);
if (choice == 2) {
processThirdStep( vershina, spisoc_smejnostii);
}
}
printf("Для завершения программы нажмите 0\n");
scanf("%d", &choice);
if (choice == 0) {
break;
}
printf("Cписок смежности->матрица инцидентности\n");
case 2:
processDynamicArrayAndPrintIncidenceMatrix(spisoc_smejnostii,
numEdges, vershina);
int** incidenceMatrix =
processsDynamicArrayAndReturnIncidenceMatrix(spisoc_smejnostii, numEdges,
vershina);
printf("Матрица инцидентности->список смежности-----> 4\n");
scanf("%d", &choice);
if (choice == 4) {
incidenceMatrixToAdjacencyList(incidenceMatrix, vershina,
numEdges);
//МАТРИЦА ИНЦИДЕНТНОСТИ СПИСОК СМЕЖНОСТИ
}
printf("Введите 1 если хотите изменить ввод\n ");
scanf("%d", &a);
if (a == 1) {
freeAdjacencyList(spisoc_smejnostii, vershina);
freeIncidenceMatrix(incidenceMatrix,numEdges);
printf("Введите количество вершин в графе: ");
scanf("%d", &vershina);
printf("Введите количество рёбер в графе: ");
scanf("%d", &numEdges);
spisoc_smejnostii = allocateAdjacencyList(vershina);
spisoc_smejnostii =
AdjacencyList_makeing(spisoc_smejnostii, numEdges);
printf("Список смежности->матрица инцидентности-----> 1\
n");
scanf("%d", &a);
if (a==1)
{
processDynamicArrayAndPrintIncidenceMatrix(spisoc_smejnostii, numEdges,
vershina);
}
printf("Матрица инцидентности->список смежности-----> 2\
n");
scanf("%d", &choice);
if (choice == 2) {
int** incidenceMatrix =
processsDynamicArrayAndReturnIncidenceMatrix(spisoc_smejnostii, numEdges,
vershina);
incidenceMatrixToAdjacencyList(incidenceMatrix,
vershina, numEdges);
freeAdjacencyList(spisoc_smejnostii, vershina);
freeIncidenceMatrix(incidenceMatrix,numEdges);
}
}
break;
}
printf("Для завершения программы нажмите 0\n");
scanf("%d", &choice);
}
}
///Пример ввода:
Выберите действие:
Ваш выбор:1
12
21
33
34
45
55
Введите начальную и конечную вершины для ребра 7:5 1
51
52
53
Матрица смежности:
Преимущества: Простота проверки смежности вершин, эффективен для плотных графов.
Недостатки: Требует O(V^2) памяти, что неэффективно для разреженных графов.
Список смежности:
Преимущества: Экономичен для разреженных графов, занимает O(V + E) памяти, где V -
количество вершин, E - количество ребер.
Недостатки: Большее время доступа к смежным вершинам.
Матрица инцидентности:
Преимущества: Прост в реализации.
Недостатки: Требует O(V * E) памяти, что неэффективно.
Матрица смежности: Двумерный массив или массив массивов (в языке C), булевы
значения для отметки смежности.
Список смежности: Динамический массив или связанный список, где каждый элемент
содержит информацию о вершине и указатель на следующий элемент
Матрица инцидентности: Двумерный массив или массив массивов (в языке C), булевы
значения для отметки инцидентности.
Вывод:
В ходе разработки этой программы, я приобрел навыки работы с различными представлениями
графов и их преобразованием. Ключевые моменты в моем опыте включают:
2.Использование функций: Я структурировал код, разбив его на функции, что сделало программу
более читаемой и легкой для обслуживания.