Advertisement
Tevronis

Graph. Find Bridge (105)

Sep 10th, 2015
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <fstream>
  5. #include <iomanip>
  6. #include <stack>
  7. #include <map>
  8. #include <set>
  9. #include <string>
  10. #include <queue>
  11.  
  12. using namespace std;
  13. typedef long long ll;
  14.  
  15. int n, m;
  16. vector<vector<int> > g(n);
  17. vector<bool> used;
  18. vector<int> tin, fup;
  19. vector<pair<int, int> > ans;
  20. int timer;
  21.  
  22. void dfs(int v, int p = -1)
  23. {
  24.     used[v] = true;
  25.     tin[v] = fup[v] = timer++;
  26.     for (int i = 0; i < g[v].size(); i++)
  27.     {
  28.         int to = g[v][i];
  29.         if (to == p)
  30.         {
  31.             continue;
  32.         }
  33.  
  34.         if (used[to])
  35.         {
  36.             fup[v] = min(fup[v], tin[to]);
  37.         }
  38.         else
  39.         {
  40.             dfs(to, v);
  41.             fup[v] = min(fup[v], fup[to]);
  42.             if (fup[to] > tin[v])
  43.             {
  44.                 ans.push_back(make_pair(v+1, to+1));
  45.             }
  46.         }
  47.     }
  48. }
  49.  
  50. void find_bridges()
  51. {
  52.     timer = 0;
  53.     for (int i = 0; i < n; i++)
  54.     {
  55.         if (!used[i])
  56.         {
  57.             dfs(i);
  58.         }
  59.     }
  60. }
  61. int main()
  62. {
  63.     cin >> n >> m;
  64.     g.resize(n);
  65.     used.resize(n);
  66.     tin.resize(n);
  67.     fup.resize(n);
  68.     vector<pair<int, int> > Ans_pair;
  69.     for (int i(0); i < m; i++)
  70.     {
  71.         int x, y;
  72.         cin >> x >> y;
  73.         x--; y--;
  74.         g[x].push_back(y);
  75.         g[y].push_back(x);
  76.         Ans_pair.push_back(make_pair(x+1, y+1));
  77.     }
  78.     find_bridges();
  79.     cout << ans.size() << endl;
  80.     for (int i(0); i < Ans_pair.size(); i++)
  81.     {
  82.         for (int j(0); j < ans.size(); j++)
  83.         {
  84.             if (ans[j] == Ans_pair[i] || (ans[j].first == Ans_pair[i].second && ans[j].second == Ans_pair[i].first))
  85.             {
  86.                 cout << i+1 << endl;
  87.                 break;
  88.             }
  89.         }
  90.     }
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement