1.0
Main
This commit is contained in:
commit
c6522b97c6
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# Auto detect text files and perform LF normalization
|
||||||
|
* text=auto
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
.vs
|
||||||
|
GrufCustom/bin
|
||||||
|
GrufCustom/obj
|
25
GrufCustom.sln
Normal file
25
GrufCustom.sln
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.2.32616.157
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GrafCustom", "GrufCustom\GrafCustom.csproj", "{855A04E3-8F24-4879-ABD9-CECA260A7645}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{855A04E3-8F24-4879-ABD9-CECA260A7645}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{855A04E3-8F24-4879-ABD9-CECA260A7645}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{855A04E3-8F24-4879-ABD9-CECA260A7645}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{855A04E3-8F24-4879-ABD9-CECA260A7645}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {550B1FB8-6683-4CE5-86D1-D61F88AF51B9}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
22
GrufCustom/Data/Edge.cs
Normal file
22
GrufCustom/Data/Edge.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
namespace GraphCustomSearcher.Data;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Шаблог ребра
|
||||||
|
/// </summary>
|
||||||
|
public class Edge
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Узел начала
|
||||||
|
/// </summary>
|
||||||
|
public Verticle VerticleStart { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Узел конца
|
||||||
|
/// </summary>
|
||||||
|
public Verticle VerticleStop { get; set; }
|
||||||
|
|
||||||
|
public Edge(Verticle verticleStart, Verticle verticleStop)
|
||||||
|
{
|
||||||
|
VerticleStart = verticleStart;
|
||||||
|
VerticleStop = verticleStop;
|
||||||
|
}
|
||||||
|
}
|
21
GrufCustom/Data/Verticle.cs
Normal file
21
GrufCustom/Data/Verticle.cs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
namespace GraphCustomSearcher.Data;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Узел
|
||||||
|
/// </summary>
|
||||||
|
public class Verticle
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Имя
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Статус посещения узла
|
||||||
|
/// </summary>
|
||||||
|
public bool IsVisited { get; set; }
|
||||||
|
|
||||||
|
public Verticle(string name)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
}
|
||||||
|
}
|
10
GrufCustom/GrafCustom.csproj
Normal file
10
GrufCustom/GrafCustom.csproj
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
76
GrufCustom/Graph.cs
Normal file
76
GrufCustom/Graph.cs
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
using GraphCustomSearcher.Data;
|
||||||
|
|
||||||
|
namespace GraphCustomSearcher;
|
||||||
|
|
||||||
|
public class Graph
|
||||||
|
{
|
||||||
|
public List<Verticle> Verticls;
|
||||||
|
public List<Edge> Edges;
|
||||||
|
public string Path { get; set; }
|
||||||
|
public Verticle Target { get; set; }
|
||||||
|
|
||||||
|
public Graph()
|
||||||
|
{
|
||||||
|
Verticls = new List<Verticle>();
|
||||||
|
Edges = new List<Edge>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Загрузка узлов
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="verticles">узлы</param>
|
||||||
|
public void AddVerticle(List<Verticle> verticles)
|
||||||
|
{
|
||||||
|
Verticls.AddRange(verticles);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Загрузка рёбер
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="edges">рёбра</param>
|
||||||
|
public void AddEdge(List<Edge> edges)
|
||||||
|
{
|
||||||
|
Edges.AddRange(edges);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RebuildEdge()
|
||||||
|
{
|
||||||
|
Path = string.Empty;
|
||||||
|
foreach (var edge in Edges)
|
||||||
|
{
|
||||||
|
edge.VerticleStop.IsVisited = false;
|
||||||
|
edge.VerticleStart.IsVisited = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Перебор рёбер - поиск вершин в которые входит точка старта
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="source"></param>
|
||||||
|
/// <param name="target"></param>
|
||||||
|
public void SearchPath(string source, string target)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Начало: {source} Конец: {target}");
|
||||||
|
var sourceVerticle = new Verticle(source);
|
||||||
|
var targetVerticle = new Verticle(target);
|
||||||
|
foreach (var edge in Edges)
|
||||||
|
{
|
||||||
|
var state_1 = edge.VerticleStart.Name == sourceVerticle.Name && edge.VerticleStart.IsVisited == sourceVerticle.IsVisited;
|
||||||
|
var state_2 = !edge.VerticleStart.IsVisited;
|
||||||
|
var state_3 = !(!string.IsNullOrEmpty(Path) && Path.Contains(edge.VerticleStop.Name));
|
||||||
|
if (state_1 && state_2 && state_3)
|
||||||
|
{
|
||||||
|
Path += edge.VerticleStart.Name + " ";
|
||||||
|
Console.WriteLine($"Ребро {edge.VerticleStart.Name} направляется в {edge.VerticleStop.Name}");
|
||||||
|
edge.VerticleStart.IsVisited = true;
|
||||||
|
Target = edge.VerticleStop;
|
||||||
|
if (targetVerticle.Name == edge.VerticleStop.Name)
|
||||||
|
{
|
||||||
|
Path += edge.VerticleStop.Name;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SearchPath(edge.VerticleStop.Name, targetVerticle.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
66
GrufCustom/Program.cs
Normal file
66
GrufCustom/Program.cs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
using GraphCustomSearcher.Data;
|
||||||
|
using GraphCustomSearcher;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ищет в направленном графе путь от точки до точки
|
||||||
|
/// учитывает наличие круговых двухсторонних связей
|
||||||
|
/// </summary>
|
||||||
|
public class Program
|
||||||
|
{
|
||||||
|
public static void Main()
|
||||||
|
{
|
||||||
|
var GraphX = new Graph();
|
||||||
|
var namesVerticles = new string[] { "Пенсильвания", "Париж", "Магеллан", "Аляска", "Аляска", "Оптимум"};
|
||||||
|
var wayEdges = new int[,] { { 0, 1 }, { 1, 0 }, { 1, 2 }, { 2, 1 }, { 2, 5 }, { 3, 1 }, { 3, 4 }, { 4, 3 } };
|
||||||
|
|
||||||
|
GraphX.AddVerticle(AddVerticles(namesVerticles));
|
||||||
|
GraphX.AddEdge(AddEdges(wayEdges, AddVerticles(namesVerticles)));
|
||||||
|
|
||||||
|
Console.WriteLine("Пенсильвания->Париж");
|
||||||
|
StartSeachPath(GraphX, "Пенсильвания", "Париж");
|
||||||
|
Console.WriteLine("Пенсильвания->Оптимум");
|
||||||
|
StartSeachPath(GraphX, "Пенсильвания", "Оптимум");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ищет путь от узла до узла
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="graph">Граф</param>
|
||||||
|
/// <param name="start">Точка старта</param>
|
||||||
|
/// <param name="stop">Точка прибытия</param>
|
||||||
|
public static void StartSeachPath(Graph graph, string start, string stop)
|
||||||
|
{
|
||||||
|
Console.WriteLine();
|
||||||
|
graph.RebuildEdge();
|
||||||
|
graph.SearchPath(start, stop);
|
||||||
|
if (stop.Contains(graph.Target.Name))
|
||||||
|
Console.WriteLine($"--> PATH: {graph.Path}");
|
||||||
|
else Console.WriteLine("--> ERROR: Путь невозможен");
|
||||||
|
Console.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавить узлы
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="namesVerticles">список имён узлов</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<Verticle> AddVerticles(string[] namesVerticles)
|
||||||
|
{
|
||||||
|
var VerticleList = new List<Verticle>();
|
||||||
|
foreach (var verticle in namesVerticles)
|
||||||
|
VerticleList.Add(new Verticle(verticle));
|
||||||
|
return VerticleList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавить рёбра (возможные пути между узлами)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="VerticleList"></param>
|
||||||
|
public static List<Edge> AddEdges(int[,] wayEdges, List<Verticle> VerticleList)
|
||||||
|
{
|
||||||
|
var EdgeList = new List<Edge>();
|
||||||
|
for(int ind = 0; ind < wayEdges.GetLength(0); ind++)
|
||||||
|
EdgeList.Add(new Edge(VerticleList[wayEdges[ind,0]], VerticleList[wayEdges[ind, 1]]));
|
||||||
|
return EdgeList;
|
||||||
|
}
|
||||||
|
}
|
11
README.md
Normal file
11
README.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<p align="center">
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://sites.google.com/view/dvurechensky" target="_blank"><img alt="Static Badge" src="https://img.shields.io/badge/Dvurechensky-N-blue"></a>
|
||||||
|
<img src="https://img.shields.io/badge/Csharp-VS2022-blue?logo=csharp&logoColor=FFFF00">
|
||||||
|
</p>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
# Кастомный консольный Graph 🐠
|
||||||
|
- Ищет путь от точки до точки, в направленном графе
|
||||||
|
- Работает только в одном направлении сверху вниз
|
||||||
|
- Создавался для узкоспециализированной задачи и мало где может пригодиться 😵
|
Loading…
Reference in New Issue
Block a user