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

2 Ход работы
Реализован класс Graph и инициализация графа (рисунок 2.1).
Рисунок 2.1 — Класс Graph
Реализован метод Graph в классе Graph, который добавляет граф с заданным количеством вершин (рисунок 2.2).
Рисунок 2.2 — Реализация метода Graph в классе Graph
Реализован метод Print, который выводит матрицу смежности в классе
Graph (рисунок 2.3).
5

Рисунок 2.3 — Реализация метода Print в классе Graph
Метод ShortestPath использует алгоритм Дейкстры для поиска
кратчайшего пути между двумя заданными городами (вершинами) в графе,
исключая третий город (рисунок 2.4). Метод инициализирует массивы dist, visited и prev, которые используются для хранения информации о расстоянии, посещенных вершинах и предыдущих вершинах соответственно. Он устанавливает начальное расстояние от города-начала до самого себя равным 0,
а все остальные расстояния устанавливает в бесконечность. Метод вводит цикл,
который продолжается до тех пор, пока все города не будут посещены. В каждой
6

итерации цикла он выбирает вершину с минимальным расстоянием, которую еще не посетил, и отмечает ее как посещенную. Затем он обновляет расстояния и предыдущие вершины для всех непосещенных соседей этой вершины,
исключая город С. После завершения цикла, метод восстанавливает путь,
начиная с конечной вершины и следуя по массиву prev. Если нет пути, то метод возвращает бесконечность в качестве расстояния и null в качестве пути. В конце метода, он возвращает пару, содержащую расстояние и путь.
Рисунок 2.4 — Метод ShortestPath в классе Graph
7
3Заключение
Входе выполнения практической работы была реализована программа инициализации графа и методы работы с ним с помощью класса Graph.
Реализация программы представлена в приложении А.
8
Приложение А
using System;
using System.Collections.Generic;
public class Graph
{
private int[,] adjMatrix; // Матрица смежности private int vertices; // Количество вершин
// Конструктор для создания графа с N узлами public Graph(int vertices)
{
this.vertices = vertices;
adjMatrix = new int[vertices, vertices];
// Инициализация матрицы смежности for (int i = 0; i < vertices; i++)
{
for (int j = 0; j < vertices; j++)
{
if (i == j)
{
adjMatrix[i, j] = 0; // расстояние от узла до самого
себя — 0
}
else
{
adjMatrix[i, j] = int.MaxValue; // бесконечность для
остальных путей
9
}
}
}
}
// Метод для добавления ребра между двумя узлами с весом public void AddEdge(int u, int v, int weight)
{
adjMatrix[u, v] = weight;
adjMatrix[v, u] = weight; // Для неориентированного графа
}
// Улучшенный метод для вывода матрицы смежности public void Print()
{
Console.WriteLine("Матрица смежности/весов графа:");
// Заголовок столбцов
Console.Write(" ");
for (int i = 0; i < vertices; i++)
{
Console.Write($"{i,5} "); // Нумерация столбцов
}
Console.WriteLine();
// Разделительная строка
Console.WriteLine(new string('-', 6 * (vertices + 1)));
10