Advertisement
Guest User

Untitled

a guest
Apr 20th, 2014
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. const int _SIZE = 200002;
  9.  
  10. struct edg
  11. {
  12.     int to, num;
  13.     edg () {}
  14.     edg(int _to, int _num)
  15.     {
  16.         to = _to;
  17.         num = _num;
  18.     }
  19. };
  20.  
  21. int n, m, timer, timer_in[_SIZE], fup[_SIZE], color[_SIZE];
  22. bool is_bridge[_SIZE], used[_SIZE], used2[_SIZE];
  23. vector<vector<edg > > g;
  24. vector<vector<int > > bridges, new_g;
  25.  
  26. void find_bridges(int from, int parent = -1)
  27. {
  28.     used[from] = 1;
  29.     timer_in[from] = fup[from] = timer++;
  30.     for (int i = 0; i < g[from].size(); ++i)
  31.     {
  32.         int to = g[from][i].to;
  33.         if (to == parent)//для петелек
  34.             continue;
  35.         if (used[to])//если были в следующей вершине
  36.             fup[from] = min(fup[from], timer_in[to]);// то чситаем сколько до верха, до текущей
  37.         else
  38.         {
  39.             find_bridges(to, from);
  40.             fup[from] = min(fup[from], fup[to]);
  41.             if (fup[to] > timer_in[from])
  42.             {
  43.                 int freq = 0;
  44.                 bool f = 0;
  45.                 for (int j = 1; j <= n; ++j)
  46.                 {
  47.                     if (j == from)
  48.                         for (int k = 0; k <= g[j].size(); ++k)
  49.                         {
  50.                             if(g[j][k].to == to)
  51.                                 freq++;
  52.                             if(freq == 2)
  53.                             {
  54.                                 f = 1;
  55.                                 break;
  56.                             }
  57.                         }
  58.                     if(f)
  59.                         break;
  60.                 }
  61.                 if(!f)
  62.                 {
  63.                     is_bridge[g[from][i].num] = 1;
  64.                     bridges[from].push_back(to);
  65.                     bridges[to].push_back(from);
  66.                 }
  67.             }
  68.         }
  69.     }
  70. }
  71.  
  72. void fill_point(int from)
  73. {
  74.     color[from] = from;
  75.     used2[from] = 1;
  76.     for (int i = 0; i < g[from].size(); ++i)
  77.     {
  78.         int to = g[from][i].to;
  79.         if(!is_bridge[g[from][i].num] && !used2[to])
  80.         {
  81.             color[to] = from;
  82.             used2[to] = 1;
  83.             fill_point(to);
  84.         }
  85.     }
  86. }
  87.  
  88. int main()
  89. {
  90.     //ifstream cin("input.txt");
  91.     cin >> n >> m;
  92.     g.resize(n + 1);
  93.     bridges.resize(n + 1);
  94.     new_g.resize(n + 1);
  95.     for (int i = 0; i < m; ++i)
  96.     {
  97.         int from, to;
  98.         cin >> from >> to;
  99.         g[from].push_back(edg(to, i));
  100.         g[to].push_back(edg(from, i));
  101.     }
  102.     timer = 0;
  103.     for (int i = 1; i <= n; ++i)
  104.         if (!used[i])
  105.             find_bridges(i);
  106.     for (int i = 1; i <= n; ++i)
  107.         if (!used2[i])
  108.             fill_point(i);
  109.     for (int i = 1; i <= n; ++i)
  110.         for (int j = 0; j < g[i].size(); ++j)
  111.             if (is_bridge[g[i][j].num])
  112.                 new_g[color[i]].push_back(color[g[i][j].to]);
  113.     int ans = 0;
  114.     for (int i = 1; i <= n; ++i)
  115.         if (new_g[i].size() == 1)
  116.             ++ans;
  117.     cout << ceil(ans / 2);
  118.     return 0;
  119. }
  120.  
  121.     int to, num;
  122.     edg () {}
  123.     edg(int _to, int _num)
  124.     {
  125.         to = _to;
  126.         num = _num;
  127.     }
  128. };
  129.  
  130. int n, m, timer, timer_in[_SIZE], fup[_SIZE], color[_SIZE];
  131. bool is_bridge[_SIZE], used[_SIZE], used2[_SIZE];
  132. vector<vector<edg > > g;
  133. vector<vector<int > > bridges, new_g;
  134.  
  135. void find_bridges(int from, int parent = -1)
  136. {
  137.     used[from] = 1;
  138.     timer_in[from] = fup[from] = timer++;
  139.     for (int i = 0; i < g[from].size(); ++i)
  140.     {
  141.         int to = g[from][i].to;
  142.         if (to == parent)//для петелек
  143.             continue;
  144.         if (used[to])//если были в следующей вершине
  145.             fup[from] = min(fup[from], timer_in[to]);// то чситаем сколько до верха, до текущей
  146.         else
  147.         {
  148.             find_bridges(to, from);
  149.             fup[from] = min(fup[from], fup[to]);
  150.             if (fup[to] > timer_in[from])
  151.             {
  152.                 is_bridge[g[from][i].num] = 1;
  153.                 bridges[from].push_back(to);
  154.                 bridges[to].push_back(from);
  155.             }
  156.         }
  157.     }
  158. }
  159.  
  160. void fill_point(int from)
  161. {
  162.     color[from] = from;
  163.     used2[from] = 1;
  164.     for (int i = 0; i < g[from].size(); ++i)
  165.     {
  166.         int to = g[from][i].to;
  167.         if(!is_bridge[g[from][i].num])
  168.         {
  169.             if (!used2[to])
  170.             {
  171.                 color[to] = from;
  172.                 fill_point(to);
  173.                 used2[to] = 1;
  174.             }
  175.         }
  176.     }
  177. }
  178.  
  179. int main()
  180. {
  181.     ifstream cin("input.txt");
  182.     cin >> n >> m;
  183.     g.resize(n + 1);
  184.     bridges.resize(n + 1);
  185.     new_g.resize(n + 1);
  186.     for (int i = 0; i < m; ++i)
  187.     {
  188.         int from, to;
  189.         cin >> from >> to;
  190.         g[from].push_back(edg(to, i));
  191.         g[to].push_back(edg(from, i));
  192.     }
  193.     timer = 0;
  194.     for (int i = 1; i <= n; ++i)
  195.         if (!used[i])
  196.             find_bridges(i);
  197.     for (int i = 1; i <= n; ++i)
  198.         if (!used2[i])
  199.             fill_point(i);
  200.     for (int i = 1; i <= n; ++i)
  201.         for (int j = 0; j < g[i].size(); ++j)
  202.             if (is_bridge[g[i][j].num])
  203.                 new_g[color[i]].push_back(color[g[i][j].to]);
  204.     int ans = 0;
  205.     for (int i = 1; i <= n; ++i)
  206.         if (new_g[i].size() == 1)
  207.             ++ans;
  208.     cout << ans;
  209.     return 0;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement