Граф – абстрактная структура данных, которая состоит из набора вершин и соединений между ними – ребер. При этом каждое ребро может иметь вес.
Рассмотрим реализацию простого графа с возможностью добавления вершин и ребер.
Ребро графа
Класс описывающий ребро графа.
/// <summary>
/// Ребро графа
/// </summary>
public class GraphEdge
{
/// <summary>
/// Связанная вершина
/// </summary>
public GraphVertex ConnectedVertex { get; }
/// <summary>
/// Вес ребра
/// </summary>
public int EdgeWeight { get; }
/// <summary>
/// Конструктор
/// </summary>
/// <param name="connectedVertex">Связанная вершина</param>
/// <param name="weight">Вес ребра</param>
public GraphEdge(GraphVertex connectedVertex, int weight)
{
ConnectedVertex = connectedVertex;
EdgeWeight = weight;
}
}
Вершина графа
Класс описывает вершину графа, с возможностью добавления списка связанных вершин.
/// <summary>
/// Вершина графа
/// </summary>
public class GraphVertex
{
/// <summary>
/// Название вершины
/// </summary>
public string Name { get; }
/// <summary>
/// Список ребер
/// </summary>
public List<GraphEdge> Edges { get; }
/// <summary>
/// Конструктор
/// </summary>
/// <param name="vertexName">Название вершины</param>
public GraphVertex(string vertexName)
{
Name = vertexName;
Edges = new List<GraphEdge>();
}
/// <summary>
/// Добавить ребро
/// </summary>
/// <param name="newEdge">Ребро</param>
public void AddEdge(GraphEdge newEdge)
{
Edges.Add(newEdge);
}
/// <summary>
/// Добавить ребро
/// </summary>
/// <param name="vertex">Вершина</param>
/// <param name="edgeWeight">Вес</param>
public void AddEdge(GraphVertex vertex, int edgeWeight)
{
AddEdge(new GraphEdge(vertex, edgeWeight));
}
/// <summary>
/// Преобразование в строку
/// </summary>
/// <returns>Имя вершины</returns>
public override string ToString() => Name;
}
Граф
Класс описывающий граф с методами добавления вершин и ребер.
/// <summary>
/// Граф
/// </summary>
public class Graph
{
/// <summary>
/// Список вершин графа
/// </summary>
public List<GraphVertex> Vertices { get; }
/// <summary>
/// Конструктор
/// </summary>
public Graph()
{
Vertices = new List<GraphVertex>();
}
/// <summary>
/// Добавление вершины
/// </summary>
/// <param name="vertexName">Имя вершины</param>
public void AddVertex(string vertexName)
{
Vertices.Add(new GraphVertex(vertexName));
}
/// <summary>
/// Поиск вершины
/// </summary>
/// <param name="vertexName">Название вершины</param>
/// <returns>Найденная вершина</returns>
public GraphVertex FindVertex(string vertexName)
{
foreach (var v in Vertices)
{
if (v.Name.Equals(vertexName))
{
return v;
}
}
return null;
}
/// <summary>
/// Добавление ребра
/// </summary>
/// <param name="firstName">Имя первой вершины</param>
/// <param name="secondName">Имя второй вершины</param>
/// <param name="weight">Вес ребра соединяющего вершины</param>
public void AddEdge(string firstName, string secondName, int weight)
{
var v1 = FindVertex(firstName);
var v2 = FindVertex(secondName);
if (v2 != null && v1 != null)
{
v1.AddEdge(v2, weight);
v2.AddEdge(v1, weight);
}
}
}