0

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

Как я понимаю, DFS посещает дочерние узлы перед братьями и сестрами. BFS посещает братьев и сестер перед детьми.

я реализовал эти два вроде этого:

public void DFT(int firstVertex) { 
    connectedVertices = 0; 
    int v; 
    Stack<Integer> stack = new Stack<Integer>(); 
    for (int i = 0; i < numVertices; i++) { 
     if(vertex[i] != null){ 
      vertex[i].setPushed(false); 
     } 
    } 
    stack.push(firstVertex); 
    connectedVertices++; 
    vertex[firstVertex].setPushed(true); 

    while(!stack.isEmpty()){ 
     v = stack.pop(); 
     vertex[v].visit(); 
     for (int i = 0; i < numVertices; i++) { 
      if(adj[v][i] != 0 && !vertex[i].getPushed()){ 
       stack.push(i); 
       connectedVertices++; 
       vertex[i].setPushed(true); 
      } 
     } 
    } 

} 

public void BFT(int firstVertex) { 
    connectedVertices = 0; 
    int v; 
    Queue<Integer> queue = new LinkedList<Integer>(); 
    for (int i = 0; i < numVertices; i++) { 
     if(vertex[i] != null){ 
      vertex[i].setPushed(false); 
     } 
    } 
    queue.add(firstVertex); 
    connectedVertices++; 
    vertex[firstVertex].setPushed(true); 

    while(!queue.isEmpty()){ 
     v = queue.remove(); 
     vertex[v].visit(); 
     for (int i = 0; i < numVertices; i++) { 
      if(adj[v][i] != 0 && !vertex[i].getPushed()){ 
       queue.add(i); 
       connectedVertices++; 
       vertex[i].setPushed(true); 
      } 
     } 
    } 

} 

Как эти методы принимают только один параметр, начальную вершину. Что делать, если меня попросят предоставить DFS и BFS с одного узла на другой узел? Вот простой пример подключенного неориентированного графа. enter image description here

Если меня попросят выполнить DFS из D в E, будут ли они D, C, A, E или D, E. Я думал, что DFS и BFS должны посещать каждый узел, в этом случае B не может быть посещен. Я не знаю, как мне изменить свои текущие методы для удовлетворения этих требований.

ответ

1

Я не уверен, что это действительно важно, если вы сначала посетите C или E. Они оба дети Д, верно? Это специфическое поведение для реализации, DFS не определяет, какой ребенок вы посещаете первым.

В ДФС, если вы выбираете ребенка С первого, то вы должны посетить, прежде чем посетить E.

В BFS, вы должны посетили как Е и С, прежде чем посетить A или B.

+0

Ах ОК , но если меня попросят выполнить dfs или bfs из одной вершины в другую вершину, я закончил, как только ударил вторую вершину? Или я должен продолжать и посещать оставшиеся вершины? В приведенном выше примере, независимо от того, посещу ли я сначала C или E, я не могу добраться до B, если конечная вершина равна E. Нужно ли, чтобы DFS/BFS посещали каждую вершину в подключенном компоненте? – Infodayne

+1

@Infodayne Если вас попросят выполнить поиск (DFS или BFS) с D на E, вам следует остановиться, как только вы доберетесь до E; вам не нужно продолжать. Теоретически BFS сначала найдет вершину, если она близка к начальной точке; где DFS сначала найдет вершину, если она находится дальше от начальной точки. – Justin

Смежные вопросы