Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 KB | None | 0 0
  1. #include <vector>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <utility>
  5. #include <queue>
  6.  
  7. std::vector<std::vector<int>> Transpose(int nodes, const std::vector<std::vector<int>>& edges) {
  8.     std::vector<std::vector<int>> new_edges(nodes);
  9.  
  10.     for (int node = 0; node < nodes; ++node) {
  11.         for (auto end : edges[node]) {
  12.             new_edges[end].push_back(node);
  13.         }
  14.     }
  15.     return new_edges;
  16. }
  17.  
  18. int Condense(const std::vector<std::vector<int>>& edges,
  19.     const std::vector<int>& colors, int nodes_number) {
  20.     std::vector<int> components(nodes_number);
  21.     std::vector<int> com_edges(nodes_number);
  22.     size_t sz = edges.size();
  23.     for (size_t node = 0; node < sz; ++node) {
  24.         int new_node = colors[node] - 1;
  25.         components[new_node] += 1;
  26.         for (auto elem : edges[node]) {
  27.             if (colors[node] != colors[elem]) {
  28.                 com_edges[colors[elem] - 1] = 1;
  29.             }
  30.         }
  31.     }
  32.     int min = sz;
  33.     for (int i = 0; i < nodes_number; ++i) {
  34.         if (com_edges[i] == 0) {
  35.             min = std::min(min, components[i]);
  36.         }
  37.     }
  38.     return min;
  39. }
  40.  
  41.  
  42. void dfs_f(const std::vector<std::vector<int>>& edges, std::vector<int>& visited,
  43.                     std::vector<int>& order, int node) {
  44.     visited[node] = 1;
  45.     for (auto elem : edges[node]) {
  46.         if (visited[elem] == 0) {
  47.             dfs_f(edges, visited, order, elem);
  48.         }
  49.     }
  50.     order.push_back(node);
  51. }
  52.  
  53. void dfs_s(const std::vector<std::vector<int>>& edges, std::vector<int>& visited,
  54.                      int node, int color) {
  55.     visited[node] = color;
  56.     for (auto elem : edges[node]) {
  57.         if (visited[elem] == 0) {
  58.             dfs_s(edges, visited, elem, color);
  59.         }
  60.     }
  61. }
  62.  
  63. int FindStronglyConnectedComponents(int nodes, const std::vector<std::vector<int>>& edges) {
  64.     std::vector<int> visited(nodes, 0);
  65.     std::vector<int> order;
  66.     for (int i = 0; i < nodes; ++i) {
  67.         if (visited[i] == 0) {
  68.             dfs_f(edges, visited, order, i);
  69.         }
  70.     }
  71.     std::reverse(order.begin(), order.end());
  72.  
  73.  
  74.     std::vector<std::vector<int>> tr_graph = Transpose(nodes, edges);
  75.  
  76.     std::vector<int> colors(nodes, 0);
  77.  
  78.     int color = 1;
  79.     for (auto node : order) {
  80.         if (colors[node] == 0) {
  81.             dfs_s(tr_graph, colors, node, color);
  82.             color++;
  83.         }
  84.     }
  85.  
  86.     return Condense(edges, colors, color - 1);
  87. }
  88.  
  89. int main() {
  90.     std::ios_base::sync_with_stdio(false);
  91.     std::cin.tie(nullptr);
  92.  
  93.    
  94.     Graph graph = Read_graph();
  95.    
  96.  
  97.     int nn, mm, fn, sn, res;
  98.     std::cin >> nn >> mm;
  99.     std::vector<std::vector<int>> edges(nn);
  100.     for (int i = 0; i < mm; ++i) {
  101.         std::cin >> fn >> sn >> res;
  102.         if (res == 1) {
  103.             edges[fn - 1].push_back(sn - 1);
  104.         }
  105.         if (res == 2) {
  106.             edges[sn - 1].push_back(fn - 1);
  107.         }
  108.     }
  109.     std::cout << nn + 1 - FindStronglyConnectedComponents(nn, edges) << std::endl;
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement