Vous devez soit de maintenir un graphique inversé, ou créer une enveloppe sur le graphique qui renverse toutes les arêtes. QuickGraph a la classe ReversedBidirectionalGraph qui est un wrapper destiné uniquement à cela, mais elle ne semble pas fonctionner avec les classes d'algorithme en raison de l'incompatibilité de type générique. J'ai dû créer ma propre classe d'emballage:
class ReversedBidirectionalGraphWrapper<TVertex, TEdge> : IVertexListGraph<TVertex, TEdge> where TEdge : IEdge<TVertex>
{
private BidirectionalGraph<TVertex, TEdge> _originalGraph;
public IEnumerable<TEdge> OutEdges(TVertex v)
{
foreach (var e in _graph.InEdges(v))
{
yield return (TEdge)Convert.ChangeType(new Edge<TVertex>(e.Target, e.Source), typeof(TEdge));
}
} //...implement the rest of the interface members using the same trick
}
Lancez ensuite DFS ou BFS sur cette enveloppe:
var w = new ReversedBidirectionalGraphWrapper<int, Edge<int>>(graph);
var result = new List<int>();
var alg = new DepthFirstSearchAlgorithm<int, Edge<int>>(w);
alg.TreeEdge += e => result.Add(e.Target);
alg.Compute(node);
réponse de Doug est incorrect, car DFS ne visiter le sous-graphe en aval. L'observateur prédécesseur n'aide pas.
merci Doug - en passant, puis-je vous demander si vous avez des commentaires sur deux questions clés que j'ai eu avec QuickGraph pour lesquelles je n'ai pas eu de réponses: http://stackoverflow.com/questions/2718241/can-quickgraph -support-ces-exigences-includes-database-persistence-support, et http://stackoverflow.com/questions/2718522/quickgraph-how-can-i-associate-an-edge-with-a-class-ie- like-you-can-with-a – Greg