Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // A C++ program to find bridges in a given undirected graph
- #include<bits/stdc++.h>
- #include <list>
- #define NIL -1
- using namespace std;
- // A class that represents an undirected graph
- class Graph
- {
- int V; // No. of vertices
- list<int> *adj; // A dynamic array of adjacency lists
- void bridgeUtil(int src,vector<bool>&vis,vector<int>&disc,vector<int>&low,int& time,int parent);
- public:
- Graph(int V); // Constructor
- void addEdge(int v, int w); // to add an edge to graph
- void bridge(); // prints all bridges
- };
- Graph::Graph(int V)
- {
- this->V = V;
- adj = new list<int>[V];
- }
- void Graph::addEdge(int v, int w)
- {
- adj[v].push_back(w);
- adj[w].push_back(v); // Note: the graph is undirected
- }
- // A recursive function that finds and prints bridges using
- // DFS traversal
- // u --> The vertex to be visited next
- // visited[] --> keeps tract of visited vertices
- // disc[] --> Stores discovery times of visited vertices
- // parent[] --> Stores parent vertices in DFS tree
- void Graph::bridgeUtil(int src,vector<bool>&vis,vector<int>&disc,vector<int>&low,int& time,int parent)
- {
- vis[src]=true;
- disc[src]=time;
- low[src]=time;
- time++;
- for(auto it=adj[src].begin();it!=adj[src].end();it++){
- if(!vis[*it]){
- bridgeUtil(*it,vis,disc,low,time,src);
- low[src]=min(low[src],low[*it]);
- if(low[*it]>disc[src]){
- cout<<src<<" "<<*it<<endl;
- }
- }
- else if(parent!=*it){
- low[src]=min(low[src],disc[*it]);
- }
- }
- }
- void Graph::bridge()
- {
- vector<bool>vis(V,false);
- vector<int>disc(V,-1);
- vector<int>low(V,-1);
- vector<int>parent();
- int time=0;
- for(int i=0;i<V;i++){
- if(!vis[i]){
- bridgeUtil(i,vis,disc,low,time,-1);
- }
- }
- }
- // Driver program to test above function
- int main()
- {
- // Create graphs given in above diagrams
- cout << "\nBridges in first graph \n";
- Graph g1(5);
- g1.addEdge(1, 0);
- g1.addEdge(0, 2);
- g1.addEdge(2, 1);
- g1.addEdge(0, 3);
- g1.addEdge(3, 4);
- g1.bridge();
- cout << "\nBridges in second graph \n";
- Graph g2(4);
- g2.addEdge(0, 1);
- g2.addEdge(1, 2);
- g2.addEdge(2, 3);
- g2.bridge();
- cout << "\nBridges in third graph \n";
- Graph g3(7);
- g3.addEdge(0, 1);
- g3.addEdge(1, 2);
- g3.addEdge(2, 0);
- g3.addEdge(1, 3);
- g3.addEdge(1, 4);
- g3.addEdge(1, 6);
- g3.addEdge(3, 5);
- g3.addEdge(4, 5);
- g3.bridge();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement