Nik_Perepelov

Ярику доп контест

Nov 16th, 2021 (edited)
437
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.66 KB | None | 0 0
  1. /* 1 таск */
  2.  
  3. #include <iostream>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. class Graph {
  9.  
  10.     vector<int> parent;
  11.     vector<vector<int>> cats;
  12.     vector<int> size;
  13.  
  14. public:
  15.  
  16.     explicit Graph(int n) {
  17.         parent.resize(n);
  18.         cats.resize(n);
  19.         size.resize(n, 1);
  20.         for (int i = 0; i < n; i++) {
  21.             parent[i] = i;
  22.             cats[i].push_back(i);
  23.         }
  24.     }
  25.  
  26.     int getParent(int v) {
  27.         if (parent[v] == v) {
  28.             return v;
  29.         }
  30.         return parent[v] = getParent(parent[v]);
  31.     }
  32.     void joinSets(int set1, int set2) {
  33.         set1 = getParent(set1);
  34.         set2 = getParent(set2);
  35.         if (set1 != set2) {
  36.             if (size[set1] < size[set2])
  37.                 swap(set1, set2);
  38.             cats[set1].insert(cats[set1].end(), cats[set2].begin(), cats[set2].end());
  39.             cats[set2].clear();
  40.             parent[set2] = set1;
  41.             size[set1] += size[set2];
  42.         }
  43.     }
  44.  
  45.     void catPr() {
  46.         int main_cat = getParent(0);
  47.         for (int i : cats[main_cat]) {
  48.             cout << i + 1 << ' ';
  49.         }
  50.     }
  51. };
  52.  
  53.  
  54.  
  55. int main() {
  56.     int n;
  57.     cin >> n;
  58.     Graph dsu(n);
  59.     for (int i = 0; i < n - 1; i++) {
  60.         int a, b;
  61.         cin >> a >> b;
  62.         dsu.joinSets(a - 1, b - 1);
  63.     }
  64.     dsu.catPr();
  65.  
  66.     return 0;
  67. }
  68.  
  69. /* 2 таск */
  70.  
  71. #include <iostream>
  72. #include <vector>
  73.  
  74. using namespace std;
  75.  
  76. class DSU {
  77.  
  78.     int number_of_sets;
  79.     vector<int> parent;
  80.  
  81. public:
  82.  
  83.    DSU(int n) {
  84.         number_of_sets = n;
  85.         parent.resize(n);
  86.         for (int i = 0; i < n; i++) {
  87.             parent[i] = i;
  88.         }
  89.     }
  90.  
  91.     int get_parent(int v) {
  92.         if (parent[v] == v)
  93.             return v;
  94.         return parent[v] = get_parent(parent[v]);
  95.     }
  96.  
  97.     void join_sets(int set1, int set2) {
  98.         set1 = get_parent(set1);
  99.         set2 = get_parent(set2);
  100.         if (set1 != set2) {
  101.             parent[set2] = set1;
  102.             number_of_sets--;
  103.         }
  104.     }
  105.  
  106.     int get_number_of_sets() const {
  107.         return number_of_sets;
  108.     }
  109. };
  110.  
  111.  
  112.  
  113. int main() {
  114.     int n, m, k;
  115.     cin >> n >> m >> k;
  116.     DSU dsu(n);
  117.     vector<int> type(k);
  118.     vector<int> from(k);
  119.     vector<int> to(k);
  120.     for (int i = 0; i < m; i++) {
  121.         int trash;
  122.         cin >> trash >> trash;
  123.     }
  124.     for (int i = 0; i < k; i++) {
  125.         string input_type;
  126.         int a, b;
  127.         cin >> input_type >> a >> b;
  128.         if (input_type == "ask")
  129.             type[i] = 1;
  130.         else
  131.             type[i] = 2;
  132.         from[i] = a - 1;
  133.         to[i] = b - 1;
  134.     }
  135.  
  136.     vector<bool> ans;
  137.     for (int i = k - 1; i >= 0; i--) {
  138.         if (type[i] == 2) {
  139.             dsu.join_sets(from[i], to[i]);
  140.         } else {
  141.             ans.push_back(dsu.get_parent(from[i]) == dsu.get_parent(to[i]));
  142.  
  143.         }
  144.     }
  145.  
  146.     for (int i = 0; i < ans.size(); i++) {
  147.         if (ans[ans.size() - i - 1])
  148.             cout << "YES" << endl;
  149.         else
  150.             cout << "NO" << endl;
  151.     }
  152.  
  153.     return 0;
  154. }
  155.  
  156. /* 3 таск */
  157.  
  158. #include <iostream>
  159. #include <vector>
  160.  
  161. using namespace std;
  162.  
  163. class Graph {
  164.     int n;
  165.     vector<vector<int>> gкфзр;
  166.     vector<int> answer;
  167.     vector<int> used;
  168. public:
  169.     Graph(int _n, vector<vector<int>> &_g) {
  170.         n = _n;
  171.  
  172.         used.resize(n);
  173.         gкфзр = _g;
  174.     }
  175.  
  176.     void dfs(int v, int parent) {
  177.         used[v] = 1;
  178.         for (auto &i: gкфзр[v]) {
  179.             if (used[i] == 1) {
  180.                 cout << "No";
  181.                 exit(0);
  182.             }
  183.             if (used[i] == 0) {
  184.                 dfs(i, v);
  185.             }
  186.         }
  187.         used[v] = 2;
  188.         answer.push_back(v);
  189.     }
  190.  
  191.     void solve() {
  192.         for (int i = 0; i < n; i++) {
  193.             if (!used[i]) {
  194.                 dfs(i, -1);
  195.             }
  196.         }
  197.     }
  198.  
  199.     void print_answer() {
  200.         cout << "Yes" << endl;
  201.         for (int i = 0; i < n; i++) {
  202.             cout << answer[n - 1 - i] + 1 << ' ';
  203.         }
  204.     }
  205. };
  206.  
  207.  
  208. int main() {
  209.     int n, m;
  210.     cin >> n >> m;
  211.     vector<vector<int>> input_graph;
  212.  
  213.     for (int i = 0; i < m; i++) {
  214.         int a, b;
  215.         cin >> a >> b;
  216.         a--;
  217.         b--;
  218.         input_graph[a].emplace_back(b);
  219.     }
  220.  
  221.     Graph g(n, input_graph);
  222.     g.solve();
  223.     g.print_answer();
  224.  
  225.  
  226.     return 0;
  227. }
  228.  
  229. /* 4 таск на основе класса из 2 таска */
  230.  
  231.  
  232. int main() {
  233.     int n;
  234.     cin >> n;
  235.     DSU dsu(n);
  236.     for (int i = 0; i < n; i++) {
  237.         int inp;
  238.         cin >> inp;
  239.         inp--;
  240.         dsu.join_sets(i, inp);
  241.     }
  242.     cout << dsu.get_number_of_sets();
  243.  
  244.     return 0;
  245. }
  246.  
  247. /* 7 таск */
  248.  
  249. //
  250. //  main.cpp
  251. //  zadacha
  252. //
  253. //  Created by Yaroslav Monastyrev on 24.10.2021.
  254. //
  255.  
  256. #include <iostream>
  257. #include <vector>
  258.  
  259. struct Edge {
  260.     int destination;
  261.     int departing_time;
  262.     int arrival_time;
  263.  
  264.     Edge() {
  265.         destination = 0;
  266.         departing_time = 0;
  267.         arrival_time = 0;
  268.     }
  269.  
  270.     Edge(int _to, int _departing_time, int _arrival_time) {
  271.         destination = _to;
  272.         departing_time = _departing_time;
  273.         arrival_time = _arrival_time;
  274.     }
  275. };
  276.  
  277. using namespace std;
  278.  
  279. class Graph {
  280.  
  281.     int n;
  282.     int start;
  283.     int finish;
  284.     vector<int> used;
  285.     vector<vector<Edge>> g;
  286.     vector<int> dist_time;
  287.  
  288. public:
  289.  
  290.     Graph(int _n, int _start, int _finish) {
  291.         n = _n;
  292.         start = _start;
  293.         finish = _finish;
  294.  
  295.         g.resize(n);
  296.         used.resize(n);
  297.         dist_time.resize(n, 1e9);
  298.         dist_time[start] = 0;
  299.     }
  300.  
  301.     void set_graph(vector<vector<Edge>> &_g) {
  302.         g = _g;
  303.     }
  304.  
  305.     void dijkstra() {
  306.         for (;;) {
  307.             int minimal_station = -1;
  308.             int minimal_time = 1e9;
  309.             for (int i = 0; i < n; i++) {
  310.                 if (!used[i] && dist_time[i] < minimal_time) {
  311.                     minimal_time = dist_time[i];
  312.                     minimal_station = i;
  313.                 }
  314.             }
  315.             if (minimal_station == -1)
  316.                 return;
  317.             used[minimal_station] = true;
  318.             for (auto &i: g[minimal_station]) {
  319.                 if (i.departing_time >= dist_time[minimal_station] && i.arrival_time < dist_time[i.destination])
  320.                     dist_time[i.destination] = i.arrival_time;
  321.             }
  322.         }
  323.     }
  324.  
  325.     int get_answer() {
  326.         if (dist_time[finish] != 1e9)
  327.             return dist_time[finish];
  328.         return -1;
  329.     }
  330.  
  331. };
  332.  
  333.  
  334. int main() {
  335.     int n, e, m;
  336.     cin >> n >> e >> m;
  337.     vector<vector<Edge>> input_graph(n);
  338.     for (int i = 0; i < m; i++) {
  339.         int k;
  340.         cin >> k;
  341.         int from, to, old_time, time;
  342.         for (int j = 0; j < k; j++) {
  343.             cin >> to >> time;
  344.             to--;
  345.             if (j > 0) {
  346.                 input_graph[from].emplace_back(to, old_time, time);
  347.             }
  348.             from = to;
  349.             old_time = time;
  350.         }
  351.     }
  352.  
  353.     Graph g(n, 0, e - 1);
  354.     g.set_graph(input_graph);
  355.     g.dijkstra();
  356.     cout << g.get_answer();
  357. }
  358.  
  359. /* 8 таск. Меняется только main*/
  360.  
  361. int main() {
  362.     int n, r, d, v;
  363.     cin >> n >> d >> v >> r;
  364.     vector<vector<Edge>> input_graph(n);
  365.     for (int i = 0; i < r; i++) {
  366.         int from, departing_time_curr, to, arrival_time_curr;
  367.         cin >> from >> departing_time_curr >> to >> arrival_time_curr;
  368.         from--;
  369.         to--;
  370.         input_graph[from].emplace_back(to, departing_time_curr, arrival_time_curr);
  371.     }
  372.  
  373.     Graph g(n, d - 1, v - 1);
  374.     g.set_graph(input_graph);
  375.     g.dijkstra();
  376.     cout << g.get_answer();
  377. }
Add Comment
Please, Sign In to add comment