2017-01-24 6 views
0

Я хочу найти расстояние от s до t на графике. как я могу изменить bfs, чтобы найти расстояние или использовать другой алгоритм, который имеет хорошие O(n). именно это важно, чтобы граф невзвешенный и неориентированныйНайти расстояние между двумя узлами в неориентированном и невзвешенном графике

+0

Как измерить расстояние, если график невзвешен? – Kapa11

+0

@ Kapa11 Обычно 1 используется в качестве веса по умолчанию в этом случае. – skypjack

+1

Почему вы хотите изменить bfs? Глядя на [здесь] (https://en.wikipedia.org/wiki/Breadth-first_search) для справки, он, похоже, сделает то, что вы хотите более или менее из коробки. Вы корни его в s, вы повторяете, пока не нажмете t. Либо вы отслеживаете расстояние до s при повторении, либо подсчитываете, как часто вы должны звонить родителям, чтобы получить от t обратно до s –

ответ

0

Вы можете изменить BFS найти (короткое) расстояния между двумя узлами.

Две важных моментов отметить перед использованием этого алгоритма:

  • В Ребре из Graph имеет вес либо или .
  • График неориентированный.

Еще одна важная вещь, чтобы отметить:

  • Вам не нужно Boolean массив пометить узел, потому что вы должны проверить условие оптимального расстояния при посещении каждого узла.
  • A Deque используется для хранения узла.
  • если вес ребра является 1, то он проталкивается к задней части, и если это 0, к фронту.

Реализация

Здесь края [v] [я] является список смежности, который существует в виде пар, т.е. ребра [v] [я] .first будет содержат узел, к которому подключен v, и edge [v] [i] .second будет содержать расстояние между v и ребрами [v] [i] .first.

Q является двухсторонняя очередь. Расстояние - это массив, где Расстояние [v] будет содержать расстояние от начального узла до узла v. Первоначально расстояние, определенное от исходного узла до каждого узла, равно бесконечности.

void bfs (int start) 
{  
     deque <int > Q;  //Double-ended queue 
     Q.push_back(start); 
     distance[ start ] = 0;  
     while(!Q.empty()) 
      { 
      int v = Q.front(); 
      Q.pop_front(); 
      for(int i = 0 ; i < edges[v].size(); i++) 
      { 


      /* if distance of neighbour of v from start node is greater 
      than sum of distance of v from start node and edge weight between v and its neighbour 
      (distance between v and its neighbour of v) ,then change it */ 


      if(distance[ edges[ v ][ i ].first ] > distance[ v ] + edges[ v ][ i ].second) 
      { 

       distance[ edges[ v ][ i ].first ] = distance[ v ] + edges[ v ][ i ].second; 

      /*if edge weight between v and its neighbour is 0 then push it to front of 
      double ended queue else push it to back*/ 

       if(edges[ v ][ i ].second == 0) 
       { 
        Q.push_front(edges[ v ][ i ].first); 
       } 
       else 
       { 
         Q.push_back(edges[ v ][ i ].first); 

       } 
      } 
      } 
     } 
} 

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

  • Нет связанных вопросов^_^