Advertisement
prakharvk

find bridges in a graph

Jul 1st, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. // A C++ program to find bridges in a given undirected graph
  2. #include<bits/stdc++.h>
  3. #include <list>
  4. #define NIL -1
  5. using namespace std;
  6.  
  7. // A class that represents an undirected graph
  8. class Graph
  9. {
  10.     int V; // No. of vertices
  11.     list<int> *adj; // A dynamic array of adjacency lists
  12.     void bridgeUtil(int src,vector<bool>&vis,vector<int>&disc,vector<int>&low,int& time,int parent);
  13. public:
  14.     Graph(int V); // Constructor
  15.     void addEdge(int v, int w); // to add an edge to graph
  16.     void bridge(); // prints all bridges
  17. };
  18.  
  19. Graph::Graph(int V)
  20. {
  21.     this->V = V;
  22.     adj = new list<int>[V];
  23. }
  24.  
  25. void Graph::addEdge(int v, int w)
  26. {
  27.     adj[v].push_back(w);
  28.     adj[w].push_back(v); // Note: the graph is undirected
  29. }
  30.  
  31. // A recursive function that finds and prints bridges using
  32. // DFS traversal
  33. // u --> The vertex to be visited next
  34. // visited[] --> keeps tract of visited vertices
  35. // disc[] --> Stores discovery times of visited vertices
  36. // parent[] --> Stores parent vertices in DFS tree
  37. void Graph::bridgeUtil(int src,vector<bool>&vis,vector<int>&disc,vector<int>&low,int& time,int parent)
  38. {
  39.     vis[src]=true;
  40.     disc[src]=time;
  41.     low[src]=time;
  42.     time++;
  43.     for(auto it=adj[src].begin();it!=adj[src].end();it++){
  44.         if(!vis[*it]){
  45.             bridgeUtil(*it,vis,disc,low,time,src);
  46.             low[src]=min(low[src],low[*it]);
  47.             if(low[*it]>disc[src]){
  48.                 cout<<src<<" "<<*it<<endl;
  49.             }
  50.          
  51.        
  52.         }
  53.         else if(parent!=*it){
  54.             low[src]=min(low[src],disc[*it]);
  55.        
  56.         }      
  57.    
  58.     }
  59. }
  60.  
  61.  
  62. void Graph::bridge()
  63. {
  64.     vector<bool>vis(V,false);
  65.     vector<int>disc(V,-1);
  66.     vector<int>low(V,-1);
  67.     vector<int>parent();
  68.     int time=0;
  69.     for(int i=0;i<V;i++){
  70.         if(!vis[i]){
  71.             bridgeUtil(i,vis,disc,low,time,-1);
  72.        
  73.         }
  74.      
  75.     }
  76.  
  77. }
  78.  
  79. // Driver program to test above function
  80. int main()
  81. {
  82.     // Create graphs given in above diagrams
  83.     cout << "\nBridges in first graph \n";
  84.     Graph g1(5);
  85.     g1.addEdge(1, 0);
  86.     g1.addEdge(0, 2);
  87.     g1.addEdge(2, 1);
  88.     g1.addEdge(0, 3);
  89.     g1.addEdge(3, 4);
  90.     g1.bridge();
  91.  
  92.     cout << "\nBridges in second graph \n";
  93.     Graph g2(4);
  94.     g2.addEdge(0, 1);
  95.     g2.addEdge(1, 2);
  96.     g2.addEdge(2, 3);
  97.     g2.bridge();
  98.  
  99.     cout << "\nBridges in third graph \n";
  100.     Graph g3(7);
  101.     g3.addEdge(0, 1);
  102.     g3.addEdge(1, 2);
  103.     g3.addEdge(2, 0);
  104.     g3.addEdge(1, 3);
  105.     g3.addEdge(1, 4);
  106.     g3.addEdge(1, 6);
  107.     g3.addEdge(3, 5);
  108.     g3.addEdge(4, 5);
  109.     g3.bridge();
  110.  
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement