Advertisement
Infernale

4 - BDS using BFS

Aug 31st, 2019
628
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <list>
  5. using namespace std;
  6.  
  7. #define MAX 1000
  8. #define pb push_back
  9.  
  10. class Graph{
  11.             int nodes;
  12.             int x = 0;
  13.             vector <int> *edges;
  14.         public:
  15.             Graph(int vertex){
  16.                 this->nodes = vertex;
  17.                 edges = new vector <int>[MAX];
  18.             }
  19.             void addEdge(int src, int to){
  20.                 edges[src].pb(to);
  21.                 edges[to].pb(src);
  22.             }
  23.             //General BFS implementation
  24.             void BFS(list <int> *q, bool *visited, int *parent){
  25.                 int curr = q->front();
  26.                 q->pop_front();
  27.                 for(auto it=edges[curr].begin(); it!=edges[curr].end(); it++){
  28.                     if(!visited[*it]){
  29.                         parent[*it] = curr;
  30.                         visited[*it] = true;
  31.                         q->pb(*it);
  32.                     }
  33.                 }
  34.             }
  35.             int checkIntersection(bool *sourceFlag, bool *destFlag){
  36.                 int intersect = -1;
  37.                 for(int i=0; i<nodes; i++)
  38.                     if(sourceFlag[i] && destFlag[i]) //Dua-duanya visit titik yang sama = udah ketemu pathnya
  39.                         return i;
  40.                 return -1;
  41.             }
  42.             void BDS(int from, int to){
  43.                 bool startVisited[nodes] = {0}, endVisited[nodes] = {0}; //Nyimpen node yang udh divisit
  44.                 int startParent[nodes], endParent[nodes]; //Nyimpen parent node kedua sisi
  45.                 list <int> startQueue, endQueue;
  46.                 int intersect;
  47.                 //Inisialisasi default value kedua sisi
  48.                 startQueue.pb(from);
  49.                 startVisited[from] = true;
  50.                 startParent[from] = -1;
  51.                 endQueue.pb(to);
  52.                 endVisited[to] = true;
  53.                 endParent[to] = -1;
  54.                 //Main loop
  55.                 while(!startQueue.empty() && !endQueue.empty()){
  56.                     //BFS dari kedua sisi
  57.                     BFS(&startQueue, startVisited, startParent);
  58.                     BFS(&endQueue, endVisited, endParent);
  59.                     //Cek kalo udah ketemu atau blm
  60.                     intersect = checkIntersection(startVisited, endVisited);
  61.                     if(intersect != -1){
  62.                         cout << "Path found! Intersect at node " << intersect << endl;
  63.                         printPath(startParent, endParent, from, to, intersect);
  64.                         return;
  65.                     }
  66.                 }
  67.                 cout << "Path not found!" << endl;
  68.             }
  69.             void printPath(int *startParent, int *endParent, int from, int to, int intersect){
  70.                 int *prev = startParent;
  71.                 vector <int> paths;
  72.                 for(int i=0; i<2; i++){ //Satu dari titik asal, satu dari titik akhir
  73.                     int meetPoint = intersect;
  74.                     while(meetPoint != -1){
  75.                         paths.pb(meetPoint);
  76.                         int prevNode = prev[meetPoint];
  77.                         meetPoint = prevNode;
  78.                     }
  79.                     prev = endParent;
  80.                 }
  81.                 //Print Path
  82.                 for(auto i = paths.begin() + 1; i != paths.end(); i++){
  83.                     cout << *i << (i == paths.end() - 1 ? "" : "->");
  84.                 }
  85.             }
  86. };
  87.  
  88. int main(){
  89.     int edges, from, to;
  90.     cout << "How many edges ? ";
  91.     cin >> edges;
  92.     Graph graph(edges);
  93.     cout << "Enter " << edges << " edeges (from-to) separated by a space:" << endl;
  94.     while(edges--){
  95.         cin >> from >> to;
  96.         graph.addEdge(from, to);
  97.     }
  98.     cout << "Enter source and destination node: ";
  99.     cin >> from >> to;
  100.     graph.BDS(from, to);
  101.     return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement