Advertisement
Infernale

3 - IDDFS

Aug 31st, 2019
525
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. #define pb push_back
  7.  
  8. class Graph{
  9.             int nodes;
  10.             vector <int> *edges;
  11.             void printAllPath(int src, int dest, bool *visited, int *path, int &pathIdx){
  12.                 visited[src] = true;
  13.                 path[pathIdx] = src;
  14.                 pathIdx++;
  15.                 if(src == dest){
  16.                     for(int i=0; i<pathIdx; i++){
  17.                         cout << path[i] << ' ';
  18.                     }
  19.                     cout << endl;
  20.                 }else{
  21.                     for(auto i=edges[src].begin(); i != edges[src].end(); i++){
  22.                         if(!visited[*i]){
  23.                             printAllPath(*i, dest, visited, path, pathIdx);
  24.                         }
  25.                     }
  26.                 }
  27.                 pathIdx--;
  28.                 visited[src] = false;
  29.             }
  30.         public:
  31.             Graph(int vertex){
  32.                 this->nodes = vertex;
  33.                 edges = new vector <int>[vertex + 1];
  34.             }
  35.             void addEdge(int src, int to){
  36.                 edges[src].pb(to);
  37.             }
  38.             void printPath(int src, int to){
  39.                 int pathIdx = 0;
  40.                 bool *visited = new bool[nodes]();
  41.                 int *path = new int[nodes]();
  42.                 cout << "Path : ";
  43.                 printAllPath(src, to, visited, path, pathIdx);
  44.             }
  45.             bool DLS(int src, int dest, int limit){
  46.                 if(src == dest){
  47.                     return true;
  48.                 }
  49.                 if(limit <= 0){
  50.                     return false;
  51.                 }
  52.                 for(auto i=edges[src].begin(); i != edges[src].end(); i++){
  53.                     if(DLS(*i, dest, limit - 1)){
  54.                         return true;
  55.                     }
  56.                 }
  57.                 return false;
  58.             }
  59.             void IDDFS(int src, int dest, int maxDepth){
  60.                 for(int i=0; i<=maxDepth; i++){
  61.                     if(DLS(src, dest, i)){
  62.                         cout << "Node found at level " << i << '!' << endl;
  63.                         printPath(src, dest);
  64.                         return;
  65.                     }
  66.                     cout << "No Intended node found from level 0 to level " << i << '!' << endl;
  67.                 }
  68.             }
  69.            
  70. };
  71.  
  72. int main(){
  73.     int edges, from, to, depth;
  74.     cout << "How many edges ? ";
  75.     cin >> edges;
  76.     Graph graph(edges);
  77.     cout << "How many levels are in the tree (root is level zero) ? ";
  78.     cin >> depth;
  79.     cout << "Enter " << edges << " edges (from-to) separated by a space:" << endl;
  80.     while(edges--){
  81.         cin >> from >> to;
  82.         graph.addEdge(from, to);
  83.     }
  84.     cout << "Enter source and destination node: ";
  85.     cin >> from >> to;
  86.     graph.IDDFS(from, to, depth);
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement