Практики(Вариант №1) / Практическая работа №6
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР) Кафедра безопасности информационных систем (БИС)
ГРАФЫ Отчет по практической работе №6 по дисциплине «Структуры данных»
Студент гр.
________
__.__.2025
Принял
Преподаватель кафедры КИБЭВС
________ Е.Е. Лунева __.__.2025
Томск 2025
Задание
Реализовать возможность работы с графом N узлов, M ребер. Выберете самостоятельно структуру. Обеспечьте следующие интерфейсные методы:
•ввод графа (можно случайным образом,можно вводить с клавиатуры) НЕДОПУСТИМО работать только с конечным числом ребер
иузлов. Приложение должно позволять вводить разные графы.
•вывод графа - матрица смежности или весов
Вариант 1. Задана система дорог. Определить кратчайшие пути из одного города (задавать из какого) ко всем другим. Восстановить путь.
2
|
Оглавление |
Задание................................................................................................................... |
2 |
Введение................................................................................................................. |
4 |
1 ХОД РАБОТЫ.................................................................................................... |
5 |
Заключение............................................................................................................. |
9 |
Приложение А...................................................................................................... |
10 |
3
Введение
Целью работы является реализация программы для работы с графами, представляющими систему дорог с переменным числом узлов и рёбер. Программа позволяет вводить графы случайным образом или с клавиатуры и выводить матрицу смежности или весов. Основное внимание уделяется нахождению города с максимальной суммой кратчайших расстояний до остальных городов.
4
1 ХОД РАБОТЫ
В работе реализуется ориентированный граф и матрица смежности. Ориентированный граф — В ориентированном графе рёбра имеют
направление, что означает, что если есть ребро от узла A к узлу B, то это не подразумевает наличие ребра от B к A.
Матрица смежности — это квадратная матрица, которая используется для представления графа. Если граф содержит N узлов, матрица будет размером NxN.
Graph – инициализирует граф с заданным количеством городов, проверяет, чтобы количество городов было больше нуля, создает матрицу смежности, устанавливая расстояние между городами на 0 для одного и того же города и на очень большое значение для всех остальных пар. (рис .1)
Рисунок 1 — Graph
5
AddEdge – добавляет двустороннюю дорогу между двумя городами с указанным расстоянием. (рис. 2)
Рисунок 2 — AddEdge
PrintAdjMatrix — выводит матрицу смежности на экран. (рис. 3)
Рисунок 3 — PrintAdjMatrix
6
ReconstructPath - Восстанавливает конкретный маршрут между двумя городами на основе результатов алгоритма Дейкстры. (рис. 4)
Рисунок 4 — ReconstructPath
7
PrintAllShortestPaths - Отображает все кратчайшие пути из заданного города с расстояниями и полными маршрутами. (рис. 5)
Рисунок 5 — PrintAllShortestPaths
8
Заключение
В ходе работы была реализована программа для работы с графами дорожных сетей, включающая функционал автоматической генерации случайных графов и ручного ввода данных, а также алгоритм Дейкстры для нахождения кратчайших путей из заданного города ко всем остальным с возможностью восстановления конкретных маршрутов.
9
Приложение А
(обязательное) Код программы
using System; |
|
|||
using System.Collections.Generic; |
||||
using System.Linq; |
||||
class Graph |
|
|
||
{ |
private int[,] adjMatrix; |
|||
|
||||
|
private int numCities; |
|||
|
public Graph(int numCities) |
|||
|
{ |
if (numCities <= 0) |
||
|
|
|||
|
|
{ |
throw new ArgumentException("Количество городов должно быть больше нуля."); |
|
|
|
} |
||
|
|
|
|
|
|
|
this.numCities = numCities; |
||
|
|
adjMatrix = new int[numCities, numCities]; |
||
|
|
// Инициализация матрицы смежности |
||
|
|
for (int i = 0; i < numCities; i++) |
||
|
|
{ |
for (int j = 0; j < numCities; j++) |
|
|
|
|
||
|
|
|
{ |
if (i == j) |
|
|
|
|
|
|
|
|
|
adjMatrix[i, j] = 0; |
|
|
|
} |
elseadjMatrix[i, j] = int.MaxValue / 2; |
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Добавление ребра |
|||
|
public void AddEdge(int u, int v, int weight) |
|||
|
{ |
if (u >= numCities || v >= numCities || u < 0 || v < 0) |
||
|
|
|||
|
|
{ |
throw new IndexOutOfRangeException("Ошибка! Указанный город не существует."); |
|
|
|
} |
||
|
|
|
|
|
|
|
if (weight <= 0) |
||
|
|
{ |
throw new ArgumentException("Расстояние между городами должно быть |
|
|
|
|
||
положительным числом."); |
||||
|
|
} |
|
|
|
|
adjMatrix[u, v] = weight; |
||
|
} |
adjMatrix[v, u] = weight; |
||
|
|
|
|
|
|
// Автоматическая генерация графа |
|||
|
public void GenerateRandomGraph(int maxEdges, int maxWeight = 100) |
|||
|
{ |
Random rand = new Random(); |
||
|
|
|||
|
|
int edgesAdded = 0; |
||
|
|
// Гарантируем связность графа |
||
|
|
for (int i = 1; i < numCities; i++) |
||
|
|
{ |
int weight = rand.Next(1, maxWeight + 1); |
|
|
|
|
||
|
|
|
|
10 |
