Advertisement
Guest User

Untitled

a guest
Sep 29th, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define pll pair < long long, long long>
  6. #define all(a) a.begin(), a.end()
  7. #define ull unsigned long long
  8. #define pii pair < int, int >
  9. #define np next_permutation
  10. #define sz(a) (int)a.size()
  11. #define sqr(x) ((x) * (x))
  12. #define right stupid_right
  13. #define left stupid_left
  14. #define vi vector <int>
  15. #define y1 stupid_cmath
  16. #define ld long double
  17. #define pb push_back
  18. #define mp make_pair
  19. #define ll long long
  20. #define pi acosl(-1.0)
  21. #define s second
  22. #define f first
  23. #define endl "\n"
  24.  
  25. const int inf = (int)1e9;
  26. const double eps = 1e-9;
  27. const int mod = 10000007;
  28. const int N = 4 * (int)1e4 + 5;
  29. const int sz = (int)5761509;
  30.  
  31. int n, m, timer, cur;
  32. vector <int> g[100100];
  33. set <int> gr[100100];
  34. bool used[100100], was[100100];
  35. int t[100100], f[100100], comp[100100];
  36. set <pair <int, int> > ans;
  37.  
  38.  
  39. void dfs(int v, int p = -1){
  40. used[v] = 1;
  41. t[v] = f[v] = timer++;
  42. for(int i = 0; i < g[v].size(); ++i){
  43. int to = g[v][i];
  44. if(to == p) continue;
  45. if(used[to]) f[v] = min(f[v], t[to]);
  46. else{
  47. dfs(to, v);
  48. f[v] = min(f[v], f[to]);
  49. if(f[to] > t[v]){
  50. ans.insert<(mp(min(to, v), max(to, v)));
  51. }
  52. }
  53. }
  54. }
  55.  
  56. void dfs1(int v, int cl){
  57. comp[v] = cl;
  58. for(int i = 0; i < g[v].size(); ++i){
  59. int to = g[v][i];
  60. pii ex = mp(min(v, to), max(v, to));
  61. if(ans.find(ex) != ans.end()) continue;
  62. if(comp[to] == -1) dfs1(to, cl);
  63. }
  64. }
  65.  
  66. void solve(){
  67. timer = 0;
  68. cur = 0;
  69. ans.clear();
  70. scanf("%d %d", &n, &m);
  71. for(int i = 0; i < n; ++i){
  72. g[i].clear();
  73. t[i] = 0;
  74. f[i] = 0;
  75. comp[i] = -1;
  76. was[i] = 0;
  77. used[i] = false;
  78. }
  79. for(int i = 0, x, y; i < n; ++i){
  80. scanf("%d %d", &x, &y);
  81. g[x].pb(y);
  82. g[y].pb(x);
  83. }
  84. dfs(0);
  85. for(int i = 0, j = 0; i < n; ++i){
  86. if(comp[i] == -1){
  87. dfs1(i, j++);
  88. }
  89. }
  90. for(int i = 0; i < n; ++i){
  91. for(int j = 0; j < g[i].size(); ++i){
  92. int to = g[i][j];
  93. gr[comp[i]].insert(comp[to]);
  94. gr[comp[to]].insert(comp[i]);
  95. }
  96. }
  97. for(int i = 0; i < n; ++i){
  98. if(gr[comp[i]].size() == 1 && !was[comp[i]]){
  99. cur++;
  100. was[comp[i]] = 1;
  101. }
  102. }
  103. printf("%d\n", (cur + 1) / 2);
  104. }
  105.  
  106. int main() {
  107. int T;
  108. scanf("%d", &T);
  109. for(int t = 1; t <= T; ++t){
  110. printf("Case %d: ", t);
  111. solve();
  112. }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement