Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

พิมพ์เส้นทางทั้งหมดจากต้นทางที่กำหนดไปยังปลายทางโดยใช้ BFS ใน C++


ในปัญหานี้ เราจะได้รับกราฟกำกับ และเราต้องพิมพ์เส้นทางทั้งหมดจากต้นทางไปยังปลายทางของกราฟโดยใช้การค้นหาแบบกว้างก่อน (BFS)

กราฟกำกับ เป็นกราฟที่มีขอบที่ชี้จากจุดยอด a ถึง b

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน -

พิมพ์เส้นทางทั้งหมดจากต้นทางที่กำหนดไปยังปลายทางโดยใช้ BFS ใน C++


ต้นทาง =K ปลายทาง =P

ผลผลิต

K -> T -> Y -> A -> P
K -> T -> Y -> P
K -> A -> P

ที่นี่เราพบเส้นทางจาก K ถึง P เราได้สำรวจเส้นทางและพิมพ์เส้นทางทั้งหมดจาก K ที่นำเราไปยัง P.

ในการพิมพ์เส้นทางทั้งหมดจากต้นทางไปยังปลายทาง เราจะต้องสำรวจกราฟและเก็บเส้นทาง จากนั้นพิมพ์เส้นทางที่ถูกต้อง

ในกรณีของการใช้ DFS กระบวนการนั้นง่าย แต่ในกรณีนี้ค่อนข้างยุ่งยากในการนำไปใช้

เพื่อแก้ปัญหานี้ เราจำเป็นต้องมีคิวที่จะเก็บเส้นทาง เริ่มจากโหนดต้นทาง เราจะเริ่มสำรวจอาร์เรย์โดยใช้ BFS สำรวจ

ต้นไม้แล้วตรวจสอบในคิว หากถึงจุดยอดปลายทาง ให้พิมพ์องค์ประกอบคิว มิฉะนั้น ให้ข้ามไป

ตัวอย่าง

โปรแกรมด้านล่างจะทำให้การแก้ปัญหาชัดเจนยิ่งขึ้น -

#include <bits/stdc++.h>
using namespace std;
void printPath(vector<char>& path) {
   int size = path.size();
   for (int i = 0; i < size; i++)
   cout<<path[i]<<" ";
   cout<<endl;
}
int isVertexVisited(char x, vector<char>& path) {
   int size = path.size();
   for (int i = 0; i< size; i++)
   if (path[i] == x)
   return 1;
   return 0;
}
void pathSourceToDestination(vector<vector<char> >&g, char src, char dst, int v) {
   queue<vector<char> > q;
   vector<char> path;
   path.push_back(src);
   q.push(path);
   while (!q.empty()) {
      path = q.front();
      q.pop();
      char last = path[path.size() - 1];
      if (last == dst)
      printPath(path);
      for (int i = 0; i < g[last].size(); i++) {
         if (!isVertexVisited(g[last][i], path)) {
            vector<char> newpath(path);
            newpath.push_back(g[last][i]);
            q.push(newpath);
         }
      }
   }
}
int main() {
   vector<vector<char> > g;
   int v = 4;
   g.resize(4);
   g['X'].push_back('S');
   g['X'].push_back('A');
   g['X'].push_back('N');
   g['A'].push_back('S');
   g['N'].push_back('X');
   g['N'].push_back('A');
   char src = 'N', dst = 'S';
   cout<<"path from src "<<src<<" to dst "<<dst<<" are \n";
   pathSourceToDestination(g, src, dst, v);
   return 0;
}

ผลลัพธ์

path from src N to dst S are
N X S
N A S
N X A S