Nik_Perepelov

7, 8 контест Александру

Nov 3rd, 2021 (edited)
428
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.28 KB | None | 0 0
  1. // 1
  2. #include <iostream>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. vector<vector<int>> graph, reversed_graph;
  7. vector<int> order, current_component;
  8. vector<bool> used;
  9.  
  10. void dfs(int u) {
  11.     used[u] = true;
  12.     for (int i = 0; i < graph[u].size(); i++)
  13.         if (!used[graph[u][i]])
  14.             dfs(graph[u][i]);
  15.     order.emplace_back(u);
  16. }
  17.  
  18. void reversed_dfs(int u) {
  19.     used[u] = true;
  20.     current_component.push_back(u);
  21.     for (int i = 0; i < reversed_graph[u].size(); i++)
  22.         if (!used[reversed_graph[u][i]])
  23.             reversed_dfs(reversed_graph[u][i]);
  24. }
  25.  
  26. int main() {
  27.     int n, m;
  28.     cin >> n >> m;
  29.     reversed_graph = vector<vector<int>> (n);
  30.     used = vector<bool> (n);
  31.     graph = vector<vector<int>> (n);
  32.     for (int i = 0; i < m; i++) {
  33.         int from, to;
  34.         cin >> from >> to;
  35.         graph[from - 1].push_back(to - 1);
  36.         reversed_graph[to-1].push_back(from - 1);
  37.     }
  38.     for (int i = 0; i < n; ++i) {
  39.         if (!used[i]) {
  40.             dfs(i);
  41.         }
  42.     }
  43.     used = vector<bool> (n);
  44.  
  45.     vector<int> answer(n);
  46.     int counter = 0;
  47.     for (int i = 0; i < n; i++) {
  48.         if (!used[order[n - 1 - i]]) {
  49.             reversed_dfs(order[n - 1 - i]);
  50.             for (int j = 0; j < current_component.size(); j++){
  51.                 answer[current_component[j]] = counter;
  52.             }
  53.             current_component.clear();
  54.             counter++;
  55.         }
  56.     }
  57.     cout << counter << endl;
  58.     for (int i = 0; i < answer.size(); i++) {
  59.         cout << answer[i] + 1<< " ";
  60.     }
  61. }
  62.  
  63. // 2
  64. #include <iostream>
  65. #include <vector>
  66. using namespace std;
  67.  
  68. vector<vector<int>> graph, reversed_graph;
  69. vector<int> order, current_component;
  70. vector<bool> used;
  71.  
  72. void dfs(int u) {
  73.     used[u] = true;
  74.     for (int i = 0; i < graph[u].size(); i++)
  75.         if (!used[graph[u][i]])
  76.             dfs(graph[u][i]);
  77.     order.emplace_back(u);
  78. }
  79. void reversed_dfs(int u) {
  80.     used[u] = true;
  81.     current_component.push_back(u);
  82.     for (int i = 0; i < reversed_graph[u].size(); i++)
  83.         if (!used[reversed_graph[u][i]])
  84.             reversed_dfs(reversed_graph[u][i]);
  85. }
  86.  
  87. int main() {
  88.     int n, m;
  89.     cin >> n >> m;
  90.  
  91.     used = vector<bool> (n);
  92.     graph = vector<vector<int>> (n);
  93.     reversed_graph = vector<vector<int>> (n);
  94.     vector<pair<int,int>> edges(m);
  95.     vector<int> answer;
  96.     for (int i = 0; i < m; i++) {
  97.         int fr, to;
  98.         cin >> fr >> to;
  99.         graph[fr-1].emplace_back(to-1);
  100.         reversed_graph[to-1].emplace_back(fr-1);
  101.         edges[i] = make_pair(fr-1, to-1);
  102.     }
  103.     for (int i = 0; i < n; i++)
  104.         if (!used[i])
  105.             dfs(i);
  106.     used = vector<bool> (n);
  107.  
  108.     vector<int> component_number(n);
  109.     int counter = 0;
  110.     for (int i = 0; i < n; ++i) {
  111.         if (!used[order[n - 1 - i]]) {
  112.             reversed_dfs(order[n - 1 - i]);
  113.             for (int j = 0; j < current_component.size(); j++){
  114.                 component_number[current_component[j]] = counter;
  115.             }
  116.             current_component.clear();
  117.             counter++;
  118.         }
  119.     }
  120.     vector<bool> is_fb_needed(counter, true);
  121.     for (int i = 0; i < m; i++){
  122.         if (component_number[edges[i].first] != component_number[edges[i].second]){
  123.             is_fb_needed[component_number[edges[i].first]] = false;
  124.         }
  125.     }
  126.     for (int i = 0; i < counter; i++){
  127.         if (is_fb_needed[i]){
  128.             for (int j = 0; j < n; j++){
  129.                 if (i == component_number[j]){
  130.                     answer.emplace_back(j + 1);
  131.                     break;
  132.                 }
  133.             }
  134.         }
  135.     }
  136.     cout << answer.size() << endl;
  137.     for (int i = 0; i < answer.size(); i++){
  138.         cout << answer[i] << endl;
  139.     }
  140. }
  141.  
  142. // 8.1
  143. #include <iostream>
  144. #include <vector>
  145. using namespace std;
  146.  
  147. struct FlowEdge {
  148.     int to;
  149.     long long capacity,flow;
  150.     FlowEdge(int to_, long long capacity_, long long flow_){
  151.         to=to_;
  152.         capacity=capacity_;
  153.         flow=flow_;
  154.     }
  155. };
  156.  
  157. int n, start = 0, finish;
  158. vector<FlowEdge> edges;
  159. vector<vector<int>> graph;
  160. vector<int> level, queue, pointer;
  161.  
  162. void add_edge(int from, int to, long long capacity){
  163.     graph[to].emplace_back(edges.size());
  164.     edges.emplace_back(from, 0, 0);
  165.     graph[from].emplace_back(edges.size());
  166.     edges.emplace_back(to, capacity, 0);
  167. }
  168. long long dfs (int u, long long flow) {
  169.     if (!flow)
  170.         return 0;
  171.     if (u == finish)
  172.         return flow;
  173.     for (; pointer[u] < graph[u].size(); pointer[u]++){
  174.         int edge_number = graph[u][pointer[u]], to = edges[edge_number].to;
  175.         if (level[to] != level[u] + 1)
  176.             continue;
  177.         long long blocking_flow = dfs(to, min(edges[edge_number].capacity - edges[edge_number].flow, flow));
  178.         if (blocking_flow) {
  179.             edges[edge_number].flow += blocking_flow;
  180.             edges[edge_number + 1].flow -= blocking_flow;
  181.             return blocking_flow;
  182.         }
  183.     }
  184.     return 0;
  185. }
  186. bool bfs() {
  187.     int queue_pointer = 0, queue_size = 0;
  188.     queue[queue_size] = start;
  189.     queue_size++;
  190.     level = vector<int> (n, -1);
  191.     level[start] = 0;
  192.     while (queue_pointer < queue_size && level[finish] == -1){
  193.         int current_v = queue[queue_pointer];
  194.         queue_pointer++;
  195.         for (int i = 0; i < graph[current_v].size(); i++){
  196.             int edge_number = graph[current_v][i], to = edges[edge_number].to;
  197.             if (level[to] == -1 && edges[edge_number].capacity > edges[edge_number].flow){
  198.                 level[to] = level[current_v] + 1;
  199.                 queue[queue_size] = to;
  200.                 queue_size++;
  201.             }
  202.         }
  203.     }
  204.     return level[finish] != -1;
  205. }
  206.  
  207.  
  208.  
  209. void dinic() {
  210.     long long flow = 0;
  211.     while(true) {
  212.         if (!bfs()) {
  213.             cout << flow;
  214.             exit(0);
  215.         }
  216.         pointer = vector<int> (n);
  217.         while (long long adding_flow = dfs(start, 2e9))
  218.             flow += adding_flow;
  219.     }
  220. }
  221.  
  222. int main() {
  223.     int m;
  224.     cin >> n >> m;
  225.     queue = vector<int> (n);
  226.     graph = vector<vector<int>> (n);
  227.     for (int i = 0; i < m; i++){
  228.         int from, to, capacity;
  229.         cin >> from >> to >> capacity;
  230.         from--; to--;
  231.         add_edge(from, to, capacity);
  232.     }
  233.     finish = n - 1;
  234.     dinic();
  235. }
Add Comment
Please, Sign In to add comment