Взвешенный направленный граф в библиотеке QuickGraph

вот пример моей проблемы.

enter image description here

Я хотел бы закодировать это на C# таким образом, чтобы я мог опросить структуру и найти такую информацию, как:

  • общее расстояние от A to B.
  • кратчайшее расстояние от A to E (keeping in виду, вы не можете идти против направления стрелки).

поэтому я подумал, что буду использовать Список смежности для моделирования моего графика, но затем я подумал, что это обычная вещь, и начал искать библиотеки, чтобы помочь ускорить процесс (не нужно заново изобретать колесо .. так далее.)

я наткнулся на библиотека это было рекомендовано пару раз по различным темам, но я нахожу это очень трудным моделированием моего нарисованного графика выше.

1 ответов


возможным решением является моделирование вашего графика как AdjacencyGraph<string, Edge<string>> построить Dictionary<Edge<string>, double> словарь затрат, где затраты-это ваши расстояния.

// ...
private AdjacencyGraph<string, Edge<string>> _graph;
private Dictionary<Edge<string>, double> _costs;

public void SetUpEdgesAndCosts()
{
    _graph = new AdjacencyGraph<string, Edge<string>>();
    _costs = new Dictionary<Edge<string>, double>();

    AddEdgeWithCosts("A", "D", 4.0);
    // snip
    AddEdgeWithCosts("C", "B", 1.0);
}

private void AddEdgeWithCosts(string source, string target, double cost)
{
    var edge = new Edge<string>(source, target);
    _graph.AddVerticesAndEdge(edge);
    _costs.Add(edge, cost);
}

код _graph сейчас:

your graph

затем вы можете найти кратчайший путь от A до E, используя:

private void PrintShortestPath(string @from, string to)
{
    var edgeCost = AlgorithmExtensions.GetIndexer(_costs);
    var tryGetPath = _graph.ShortestPathsDijkstra(edgeCost, @from);

    IEnumerable<Edge<string>> path;
    if (tryGetPath(to, out path))
    {
        PrintPath(@from, to, path);
    }
    else
    {
        Console.WriteLine("No path found from {0} to {1}.");
    }
}

это взято из QuickGraph wiki. Он печатает:

Path found from A to E: A > D > B > E