Почему это вызывает ошибку переполнения стека?Направленный граф - PullRequest
0 голосов
/ 26 ноября 2018

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

void colorRoots(Vertex root, Vertex v) {

    if (v.getColor() == DiGraph.BLACK) {
        root.setColor(DiGraph.BLACK);
    }

    for (Vertex g : v.neighbors()) {
        if (g.getColor() == DiGraph.GREY || g.getColor() == DiGraph.BLACK) {
            colorRoots(root, g); 
        }
    }
}

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

void dfs(Vertex v) {

    if(v.getColor()==DiGraph.GREY) {
        v.setColor(DiGraph.BLACK);
    }else {
        v.setColor(DiGraph.GRAY);
    }


    for (Vertex g : v.neighbors()) {
        if(g.getColor()==DiGraph.WHITE || g.getColor()==DiGraph.GREY) {
        dfs(g); 
        }
    }   
    } 

Может ли проблема быть в методе dsf?

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

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

У рекурсивного вызова в цикле dfs(g) нет логического завершения.Каждый обработанный объект Vertex вызывает neighbors(), и каждый сосед Vertex вызывает соседей, а каждый сосед вызывает соседей ... и так далее.

0 голосов
/ 26 ноября 2018

, изменив DSF на

void dfs(Vertex v) {

        v.setColor(DiGraph.GREY);

    for (Vertex g : v.neighbors()) {
        if(g.getColor()==DiGraph.WHITE) {
        dfs(g); 
        }
    }   
    v.setColor(DiGraph.BLACK);
    } 

Кажется, чтобы решить эту проблему.

0 голосов
/ 26 ноября 2018

Проверьте, как вы пишете «СЕРЫЙ» против «СЕРЫЙ» в dfs, может быть проблема.

...