2013-08-27 7 views
6

다음은 내 문제의 예입니다.QuickGraph 라이브러리의 가중 된 직접 그래프

enter image description here

나는 구조를 심문하고 다음과 같은 정보를 찾을 수 있도록하는 방법으로 C#에서이 코드 싶습니다 :

  • 총 거리 에서B에 .
  • 최단 거리 에서 (당신은 화살표의 반대 방향으로 갈 수 염두에두고) E합니다.

그래서 그래프를 모델링하기 위해 인접 목록을 사용한다고 생각했지만, 이것이 일반적인 것이라고 생각하고 프로세스를 빠르게하는 데 도움이되는 라이브러리를 찾기 시작했습니다. 휠을 다시 발명 할 필요가 없습니다. 등)

나는 여러 주제에 대해 두 시간 정도 권장되었던 this Library을 보았지만 위에 그려진 그래프를 실제로 모델링하는 것은 정말 힘들다.

답변

7

가능한 해결책은 그래프를 AdjacencyGraph<string, Edge<string>>으로 모델링하고 비용이 거리 인 Dictionary<Edge<string>, double> 비용 사전을 작성하는 것입니다. 귀하의 _graph

// ... 
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); 
} 

는 지금 :

your graph

은 그럼 당신은 사용하는 E A에서 최단 경로를 찾을 수 있습니다

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에서 적응된다. 그것은 인쇄 [Github에서의 예를 작업

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

(https://github.com/serra/QuickgraphExamples/blob/master/src/examples/CalculateDistance.cs) – Marijn