Advertisement
RaFiN_

BridgeTree

Feb 20th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.27 KB | None | 0 0
  1. int t,d[MAX],l[MAX];vi v[MAX],edge[MAX];set<pii>bridges;int visited[MAX],cycle[MAX],n,vis[MAX];
  2. void dfs(int s,int p = -1){
  3.  
  4.     d[s] = l[s] = ++t;
  5.     vis[s] = 1;
  6.     for(auto it : v[s]){
  7.         if(it==p)continue;
  8.         if(vis[it]){
  9.  
  10.             l[s] = min(l[s],d[it]);
  11.         }
  12.         else {
  13.  
  14.             dfs(it,s);
  15.             if(d[s]<l[it]){
  16.                 int x = min(it,s);
  17.                 int y = max(it,s);
  18.                 bridges.insert(pii(x,y));
  19.             }
  20.             l[s] = min(l[s],l[it]);
  21.         }
  22.     }
  23. }
  24.  
  25. void extract_bc(int s,int root)
  26. {
  27.     if(visited[s])return ;
  28.     visited[s] = 1;
  29.     cycle[s] = root;
  30.     for(auto it : v[s]){
  31.         int x = min(it,s);
  32.         int y = max(it,s);
  33.         if(bridges.find(pii(x,y))==bridges.end()){
  34.             extract_bc(it,root);
  35.         }
  36.     }
  37.  
  38. }
  39.  
  40. void make_BridgeTree()
  41. {
  42.     for(int i = 1;i<=n;i++)if(!vis[i])dfs(i);
  43.     for(int i = 1;i<=n;i++){
  44.         if(!visited[i])extract_bc(i,i);
  45.     }
  46.     for(int i = 1;i<=n;i++){
  47.         for(int j = 0;j<v[i].size();j++){
  48.             int x = v[i][j];
  49.             if(cycle[i]!=cycle[x]){
  50.                 ///cout<<cycle[i]<<" "<<cycle[x]<<" "<<i<<" "<<x<<endl;
  51.                 edge[cycle[i]].pb(cycle[x]);
  52.             }
  53.         }
  54.     }
  55.  
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement