Advertisement
Guest User

Untitled

a guest
Feb 15th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define pb push_back
  4. #define ll long long
  5. #define ld long double
  6. #define sqr(a) (a) * (a)
  7. #define F first
  8. #define S second
  9.  
  10. using namespace std;
  11.  
  12. //mt19937 gen(time(0));
  13.  
  14. const int maxn = 1e4 + 10;
  15.  
  16. vector <int> g[maxn];
  17. map <pair <int, int>, int> mp;
  18. map <pair <int, int>, int> cnmp;
  19. int tin[maxn];
  20. int up[maxn];
  21. int timer = 0;
  22. bool dot[maxn];
  23. bool bridge[maxn * 10];
  24.  
  25.  
  26. void dfs(int v, int pr)
  27. {
  28. timer++;
  29. tin[v] = timer;
  30. up[v] = timer;
  31. int cnt = 0;
  32. for(int to:g[v])
  33. {
  34. if (to == pr) continue;
  35. if (tin[to] == 0)
  36. {
  37. cnt++;
  38. dfs(to, v);
  39. up[v] = min(up[v], up[to]);
  40. if (up[to] >= tin[v] && pr != -1)
  41. {
  42. dot[v] = true;
  43. }
  44. int x = v;
  45. int y = to;
  46. if (y > x) swap(x, y);
  47. if (up[v] < up[to] && cnmp[make_pair(x, y)] == 1)
  48. {
  49. bridge[mp[make_pair(x, y)]] = true;
  50. }
  51. }
  52. else
  53. {
  54. up[v] = min(up[v], tin[to]);
  55. }
  56. }
  57. if (pr == -1 && cnt > 1)
  58. {
  59. dot[v] = true;
  60. }
  61. return;
  62. }
  63.  
  64. int main()
  65. {
  66. freopen("input.txt", "r", stdin);
  67. freopen("output.txt", "w", stdout);
  68. ios_base::sync_with_stdio(false);
  69. cin.tie(0);
  70. cout.tie(0);
  71. int n, m;
  72. cin >> n >> m;
  73. for(int i = 0; i < m; i++)
  74. {
  75. int x, y;
  76. cin >> x >> y;
  77. x--;
  78. y--;
  79. if (y > x) swap(x, y);
  80. g[x].pb(y);
  81. g[y].pb(x);
  82. mp[make_pair(x, y)] = i;
  83. cnmp[make_pair(x, y)]++;
  84.  
  85. }
  86. for(int i = 0; i < n; i++)
  87. if (tin[i] == 0) dfs(i, -1);
  88. int cnt = 0;
  89. for(int i = 0; i < m; i++)
  90. if (bridge[i]) cnt++;
  91. cout << cnt << '\n';
  92. for(int i = 0; i < m; i++)
  93. if (bridge[i]) cout << i + 1 << '\n';
  94.  
  95. cnt = 0;
  96. for(int i = 0; i < n; i++)
  97. if (dot[i]) cnt++;
  98. cout << cnt << '\n';
  99. for(int i = 0; i < n; i++)
  100. if (dot[i]) cout << i + 1 << '\n';
  101. return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement