Advertisement
Guest User

Untitled

a guest
Oct 27th, 2016
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <list>
  4. #include <queue>
  5. #include <unordered_map>
  6.  
  7. using namespace std;
  8.  
  9. class Graph
  10. {
  11.   int v;
  12.   vector<list<int> > adjlist;
  13.   unordered_map <string, int> map1;
  14.   unordered_map <int, string> map2;
  15.  
  16.   void dfsUtil(int s, vector<bool> &visited)
  17.   {
  18.     visited[s] = true;
  19.     cout << getText(s) << " ";
  20.     for(auto n: adjlist[s])
  21.     {
  22.       if(visited[n] == false)
  23.       {
  24.         dfsUtil(n, visited);
  25.       }
  26.     }
  27.   }
  28.  
  29.   public:
  30.   Graph()
  31.   {
  32.     v = 0;
  33.   }
  34.  
  35.   string getText(int c)
  36.   {
  37.     return map2[c];
  38.   }
  39.  
  40.   int getNumber(string text)
  41.   {
  42.     if(map1.count(text) > 0)
  43.     {
  44.       return map1[text];
  45.     }
  46.     else
  47.     {
  48.         map1[text] = v;
  49.         map2[v] = text;
  50.         v++;
  51.         return v - 1;
  52.     }
  53.   }
  54.  
  55.   void addEdge(string x, string y)
  56.   {
  57.     int u = getNumber(x);
  58.     int v = getNumber(y);
  59.    
  60.     if((int) adjlist.size() == u)
  61.     {
  62.       list<int> temp;
  63.       temp.push_back(v);
  64.       adjlist.push_back(temp);
  65.     }
  66.     else
  67.     {
  68.       adjlist[u].push_back(v);
  69.     }
  70.    
  71.     if((int) adjlist.size() == v)
  72.     {
  73.       list<int> temp;
  74.       adjlist.push_back(temp);
  75.     }  
  76.   }
  77.  
  78.   void DFS(string s)
  79.   {
  80.     vector<bool> visited(v, false);
  81.    
  82.     dfsUtil(getNumber(s), visited);
  83.    
  84.     for(int i = 0;i < v; ++i)
  85.     {
  86.       if(visited[i] == false)
  87.       {
  88.            dfsUtil(i, visited);
  89.       }
  90.     }
  91.     cout << endl;
  92.   }
  93.  
  94.   void BFSUtil(int s, vector<bool> &visited)
  95.   {
  96.     queue<int> q;
  97.     q.push(s);
  98.     visited[s] = true;
  99.    
  100.     while(!q.empty())
  101.     {
  102.       int current = q.front();
  103.      
  104.       q.pop();
  105.       cout << getText(current) << " ";
  106.      
  107.       for(auto n : adjlist[current])
  108.       {
  109.         if(visited[n] == false)
  110.         {
  111.           visited[n] = true;
  112.           q.push(n);
  113.         }
  114.       }
  115.      
  116.     }
  117.   }
  118.                
  119.  
  120.   void BFS(string s)
  121.   {
  122.     vector<bool> visited(v, false);
  123.     BFSUtil(getNumber(s), visited);
  124.    
  125.     for(int i = 0;i < v; ++i)
  126.     {
  127.       if(visited[i] == false)
  128.       {
  129.            BFSUtil(i, visited);
  130.       }
  131.     }
  132.    
  133.     cout << endl;
  134.    
  135.   }
  136.  
  137.   int findVertex()
  138.   {
  139.     for(int i=0; i<v;++i)
  140.     {
  141.       if(adjlist[i].size() == 0)
  142.         return i;
  143.     }
  144.     return -1;
  145.   }
  146.  
  147.   void topological()
  148.   {
  149.     vector<int> indegree(v, 0);
  150.     for(int i = 0; i < v; ++i)
  151.     {
  152.       for(auto n: adjlist[i])
  153.       {
  154.         indegree[n] += 1;
  155.       }
  156.     }
  157.    
  158.     queue<int> q;
  159.    
  160.     for(unsigned int i =0; i < indegree.size(); ++i)
  161.     {
  162.       if(indegree[i] == 0)
  163.       {
  164.         q.push(i);
  165.       }
  166.     }
  167.    
  168.     vector<int> order;
  169.    
  170.     while(!q.empty())
  171.     {
  172.       int current = q.front(); q.pop();
  173.       order.push_back(current);
  174.      
  175.       for(auto n: adjlist[current])
  176.       {
  177.         indegree[n] -= 1;
  178.         if(indegree[n] == 0)
  179.           q.push(n);
  180.       }
  181.     }
  182.    
  183.     if((int) order.size() != v)
  184.     {
  185.       cout << "Not possible" << endl;
  186.       return ;
  187.     }
  188.    
  189.     for(auto element: order)
  190.     {
  191.       cout << getText(element) << " " << endl;
  192.     }
  193.   }
  194.  
  195. };
  196.  
  197. int main()
  198. {
  199.     Graph g;
  200.      
  201.     g.addEdge("b", "a");
  202.     g.addEdge("c", "a");
  203.     g.addEdge("d", "a");
  204.     g.addEdge("e","c");
  205.     g.addEdge("f", "d");
  206.     g.addEdge("f", "e");
  207.     g.addEdge("g", "h");
  208.     //g.addEdge("b", "a");
  209.  
  210.     cout << "Following is Depth First Traversal (starting from vertex 2) \n";
  211.     g.DFS("g");
  212.  
  213.     cout << "Following is Breadth First Traversal (starting from vertex 2) \n";
  214.     g.BFS("g");
  215.  
  216.     g.topological();
  217.  
  218.     return 0;
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement