
СД Практика 6
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронновычислительных систем (КИБЭВС)
ГРАФЫ Отчет по практической работе №6
по дисциплине «Структуры данных»
Студент гр. 7х3-х
_______ хххххххх
_______
Принял: Преподаватель КИБЭВС
_______ Уразаев Д.Р.
_______
Томск 2024
Задание
Реализовать возможность работы с графом N узлов, M ребер. Выберете самостоятельно структуру. Обеспечьте следующие интерфейсные методы:
•Ввод графа (можно случайным образом, можно вводить с клавиатуры) НЕДОПУСТИМО работать только с конечным числом ребер и узлов. Приложение должно позволять вводить разные графы;
•Вывод графа – матрица смежности или весов.
Граф допускается использовать как ориентированный, так и неориентированный. Обязательно знать определения данных графов.
Вариант 2. Задана система дорог. Определить, до какого города максимальное кратчайшее расстояние из города А – задать А. Восстановите путь.
2
|
|
Содержание |
|
1 |
Введение.............................................................................................................. |
4 |
|
2 |
ХОД РАБОТЫ.................................................................................................... |
5 |
|
|
2.1 |
Ввод графа.................................................................................................. |
5 |
|
2.2 |
Нахождение кратчайшего пути до города А.......................................... |
6 |
|
2.3 |
Вывод графа............................................................................................... |
8 |
Заключение............................................................................................................. |
9 |
||
Приложение А...................................................................................................... |
10 |
3
1 Введение
Целью работы является реализация графа при помощи динамических структур на языке программирования C#.
4

2 ХОД РАБОТЫ
2.1Ввод графа
Вприложении А представлен листинг реализованной программы.
С клавиатуры вводятся значения узлов и ребер. Элементы получаемой матрицы задаются случайным образом. Фрагмент кода, отвечающий за ввод графа представлен на рисунке 2.1.
Рисунок 2.1 – Ввод графа
5
2.2 Нахождение кратчайшего пути до города А
Кратчайший путь до города А находится с помощью алгоритма Дейкстры. В программе он реализуется с помощью public метода
MaxShortestPathFrom() и private методов GetPath() и Dijkstra().
Метод Dijkstra() устанавливает изначальное расстояние до начальной вершины равное нулю, а до всех остальных – максимально большому числу, также создается массив посещенных вершин. На каждом шаге выбирается непосещённая вершина с наименьшим расстоянием. Для каждой соседней вершины текущей вершины происходит проверка: можно ли улучшить расстояние до неё, проходя через текущую. Если да, то расстояние обновляется. После обработки всех соседей текущей вершины она добавляется в массив посещённых. В конечном итоге метод возвращает кратчайшее расстояние от начальной вершины.
Метод GetPath() восстанавливает путь, который был пройден до города А. Метод возвращает список вершин, через которые проходил путь до города А с помощью обратного прохода.
Метод MaxShortestPathFrom() выводит кратчайшее расстояние до города А и путь, который был пройден до него, а также осуществляет проверку на существования пути до города А.
Методы представлены на рисунке 2.2.
6

Рисунок 2.2 – Методы для нахождения кратчайшего пути до города А
7

2.3 Вывод графа
Граф выводится в виде матрицы смежности с помощью метода Print(). На рисунке 2.3 представлена реализация в программе.
Рисунок 2.3 – Вывод графа Результат работы программы представлен на рисунке 2.4.
Рисунок 2.4 – Результат работы программы
8
Заключение
В ходе выполнения данной практической работы был реализован граф с помощью классов, а также типовые методы для работы с ним.
9
Приложение А
class Graph
{
private int n; private int[,] graph; public Graph(int n)
{
this.n = n;
graph = new int[n, n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
graph[i, j] = int.MaxValue;
}
}
}
public void Edge(int u, int v, int weight = 1)
{
graph[u, v] = weight; graph[v, u] = weight;
}
public void Random(int m, int maxWeight = 10)
{
Random rand = new Random(); for (int i = 0; i < m; i++)
{
int u = rand.Next(n); int v = rand.Next(n);
int weight = rand.Next(1, maxWeight + 1); Edge(u, v, weight);
}
}
public void Print()
{
Console.Write("Город:\t"); for (int i = 0; i < n; i++)
{
Console.Write(i + "\t");
}
Console.WriteLine();
for (int i = 0; i < n; i++)
10