Advertisement
Guest User

Untitled

a guest
Jul 26th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. vector<int> ans;
  8. vector<int> edge[5000], br[5000];
  9. int timer = 0, tin[5000], up[5000], c[5000], bright[5001];
  10. bool used[5000], used1[100000];
  11.  
  12. void dfs (int v, int s, int p = -1) {
  13.     used[v] = 1;
  14.     tin[v] = ++timer;
  15.     up[v] = timer;
  16.     for (int i = 0; i < edge[v].size(); i++) {
  17.         int u = edge[v][i];
  18.         if (u != p) {
  19.             if (tin[u]) {
  20.                 up[v] = min(up[v], tin[u]);
  21.             } else {
  22.                 dfs(u, i, v);
  23.                 up[v] = min(up[v], up[u]);
  24.             }
  25.         }
  26.     }
  27.     if (p != -1 && up[v] == tin[v]) {
  28.         used1[br[p][s]] = 1;
  29.     }
  30. }
  31.  
  32. void dfs1(int v, int color) {
  33.     used[v] = true;
  34.     c[v] = color;
  35.     for (int i = 0; i < edge[v].size(); i++) {
  36.         int u = edge[v][i];
  37.         if (used1[br[v][i]] && (c[u] != 0)) {
  38.             bright[color] += 1;
  39.             bright[c[u]] += 1;
  40.         } else if (!used1[br[v][i]] && !used[u])
  41.             dfs1(u, color);
  42.     }
  43. }
  44.  
  45. int main()
  46. {
  47.     int n, m, a, b;
  48.     cin >> n >> m;
  49.     for (int i = 0; i < m; i++) {
  50.         cin >> a >> b;
  51.         --a;
  52.         --b;
  53.         edge[a].push_back(b);
  54.         edge[b].push_back(a);
  55.         br[a].push_back(i);
  56.         br[b].push_back(i);
  57.     }
  58.     for (int i = 0; i < n; i++)
  59.         if (!used[i])
  60.             dfs(i, 0);
  61.     for (int i = 0; i < n; i++)
  62.         used[i] = 0;
  63.     for (int i = 0; i < n; i++)
  64.         if (!used[i])
  65.             dfs1(i, i + 1);
  66.     int cnt = 0;
  67.     for (int i = 1; i < n + 1; i++)
  68.         cnt += (bright[i] == 1);
  69.     cout << cnt / 2 + cnt % 2;
  70.     /*for (int i = 0; i < n; i++)
  71.         cout << c[i] << ' ';
  72.     cout << endl;
  73.     for (int i = 0; i < n + 1; i++)
  74.         cout << bright[i] << ' ';
  75.     cout << endl;*/
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement