Advertisement
Manioc

find bridge

Aug 3rd, 2018
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.07 KB | None | 0 0
  1. #define MAX 20007
  2. using namespace std;
  3.  
  4. bitset<MAX> vis;
  5. vector<int> graph[MAX];
  6. int sz, n, q, ans, num[MAX], parent[MAX], low[MAX];
  7.  
  8. void dfs(int no){
  9.     vis[no] = true;
  10.     num[no] = low[no] = sz++;
  11.     for(int i = 0; i < graph[no].size(); i++){
  12.         int child = graph[no][i];
  13.         if(!vis[child]){
  14.             parent[child] = no;
  15.             dfs(child);
  16.             if(low[child] > num[no]) ans++;
  17.             low[no] = min(low[no], low[child]);
  18.         }else if(child != parent[no]) low[no] = min(low[no], num[child]);
  19.     }
  20. }
  21.  
  22. void ponte(){
  23.     sz = 0;
  24.     ans = 0;
  25.     vis.reset();
  26.     memset(low, -1, sizeof low);
  27.     memset(num, -1, sizeof num);
  28.     memset(parent, -1, sizeof parent);
  29.     dfs(1);
  30. }
  31. int main(){
  32.     while(cin >> n >> q){
  33.         for(int i = 0; i <= n; i++){
  34.             graph[i].clear();
  35.         }
  36.         for(int i = 0; i < q; i++){
  37.             int a, b; cin >> a >> b;
  38.             graph[a].push_back(b);
  39.             graph[b].push_back(a);
  40.         }
  41.         ponte();
  42.         cout << ans << endl;
  43.     }
  44.     return 0;
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement