C # алгоритм поиска всех путей между двумя вершинами


Недавно была поставлена задача реализовать в C#ориентированный граф с весами.

Я нахожусь на 3/4 пути туда, но я должен использовать тестовые данные и возвращать ответы, основанные на этих данных.

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

Что меня озадачивает, так это то, что один из вопросов заключается в следующем: найти количество маршрутов от узла "С" до "С" со стоимостью менее 30.

Приведенный пример ответа

CDC, 
CBEC, 
CEBCDC, 
CDEBC, 
CEBCEBC, 
CEBCEBCEBC  **7 in total**
These are the input graph details 
"A to B: 5",
"B to C: 4", 
"C to D: 8", 
"D to C: 8", 
"D to E: 6",
"A to D: 5" 
"C to E: 2", 
"E to B: 3", 
"A to E: 7"

Я могу получить

CDC,
CEBC,
CDEBC

Используя поиск по глубине, но я понятия не имею, откуда взялись остальные 4 или почему вы рассматриваете маршрут, который вы уже приземляетесь в узле назначения и продолжаете двигаться дальше.

Я использую неправильный алгоритм? Вот что я пытаюсь сделать:

public void depthSearch(GraphDeclare<string> graph, LinkedList<DirectedGraphNode<string>> Visited)
    {
        string endNode = "C";
        LinkedList<DirectedGraphNode<string>> nodes = getNeighboursAdjecentNodes(graph, Visited.Last());
        //examine the adjecent nodes
        foreach (DirectedGraphNode<string> node in nodes)
        {

            Boolean contains = Visited.Any(x => x.Value == node.Value);

            if (contains == true)
            {
                // Console.WriteLine("Hello");
                // printPath(Visited);
                continue;
            }
            if (node.Value == endNode)
            {
                Visited.AddLast(node);
                printPath(Visited);
                Visited.RemoveLast();
                break;
            }
        }

        foreach (DirectedGraphNode<string> node in nodes)
        {

            Boolean contain = Visited.Any(x => x.Value == node.Value);

            if (contain == true || node.Value == endNode)
            {
                continue;
            }
            Visited.AddLast(node);
            depthSearch(graph, Visited);
            Visited.RemoveLast();
        }

    }

    private void printPath(LinkedList<DirectedGraphNode<string>> visited)
    {
        StringBuilder cb = new StringBuilder();
        foreach (DirectedGraphNode<string> node in visited)
        {
            cb.AppendLine(node.Value + " ");

        }
        Console.WriteLine(cb.ToString());
    }


    private LinkedList<DirectedGraphNode<string>> getNeighboursAdjecentNodes(GraphDeclare<string> graph, DirectedGraphNode<string> n)
    {
        LinkedList<DirectedGraphNode<string>> neighbours = new LinkedList<DirectedGraphNode<string>>();

        foreach (DirectedGraphNode<string> edge in graph.nodeSet)
        {

            if (edge.Value.Equals(n.Value))
            {
                foreach (DirectedGraphNode<string> neighbour in edge.NeighbourNodes)
                {
                    neighbours.AddLast(neighbour);
                }

            }
        }

        return neighbours;
    }
1 3

1 ответ:

Вы можете изменить DFS, чтобы продолжать использовать все узлы, даже если они были посещены, и вы должны остановить алгоритм, когда общее расстояние превышает 30. Вы также должны обновлять счетчик для искомых путей каждый раз, когда вы добираетесь до "C".