Вам либо нужно поддерживать перевернутый граф, либо создать обертку над графом, которая переворачивает каждое ребро.
QuickGraph имеет класс ReversedBidirectionalGraph, который является оберткой, предназначенной именно для этого, но, похоже, не работает с классами алгоритма из-за несовместимости универсального типа.
Я должен был создать свой собственный класс оболочки:
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
}
Затем запустите DFS или BFS для этой оболочки:
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);
Ответ Дуга неправильный, потому что DFS будет посещать только нижний подграф. Предшественник-наблюдатель не помогает.