Advertisement
Nik_Perepelov

Доп контест Александру

Nov 17th, 2021 (edited)
466
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.33 KB | None | 0 0
  1. // 1
  2.  
  3. #include <iostream>
  4. #include <vector>
  5.  
  6. using namespace std;
  7. vector<int> weight;
  8. struct SNM {
  9.     vector<int> parent;
  10.     vector<vector<int>> v_cats;
  11.    
  12.  
  13.     int get_parent(int vertex) {
  14.         if (parent[vertex] == vertex)
  15.             return vertex;
  16.         return parent[vertex] = get_parent(parent[vertex]);
  17.     }
  18.  
  19.     void join_sets(int m1, int m2) {
  20.         m1 = get_parent(m1);
  21.         m2 = get_parent(m2);
  22.         if (m1 != m2) {
  23.             if (weight[m1] < weight[m2]){
  24.                 int temporary = m1;
  25.                 m1 = m2;
  26.                 m2 = temporary;
  27.             }
  28.             v_cats[m1].insert(v_cats[m1].end(), v_cats[m2].begin(), v_cats[m2].end());
  29.             parent[m2] = m1;
  30.             v_cats[m2].clear();
  31.             weight[m1] += weight[m2];
  32.         }
  33.     }
  34.  
  35.     void init(int n) {
  36.         parent = vector<int>(n);
  37.         v_cats = vector<vector<int>> (n);
  38.         weight = vector<int>(n, 1);
  39.         for (int i = 0; i < n; i++) {
  40.             v_cats[i].push_back(i);
  41.             parent[i] = i;
  42.         }
  43.     }
  44. };
  45.  
  46. int main() {
  47.     int n;
  48.     cin >> n;
  49.     SNM snm;
  50.     snm.init(n);
  51.  
  52.     for (int i = 0; i < n - 1; i++){
  53.         int a, b;
  54.         cin >> a >> b;
  55.         snm.join_sets(a - 1, b - 1);
  56.     }
  57.  
  58.     int last_parent = snm.get_parent(0);
  59.  
  60.     for (int i = 0; i < n; i++)
  61.         cout << snm.v_cats[last_parent][i] + 1 << ' ';
  62.  
  63.     return 0;
  64. }
  65.  
  66. // 2
  67.  
  68. #include <iostream>
  69. #include <vector>
  70.  
  71. using namespace std;
  72.  
  73. struct SNM {
  74.     int cnt;
  75.     vector<int> parent;
  76.     //vector<vector<int>> v_cats;
  77.  
  78.     void init(int n) {
  79.         cnt = n;
  80.         parent = vector<int>(n);
  81.         //v_cats = vector<vector<int>> (n);
  82.         for (int i = 0; i < n; i++) {
  83.             //v_cats[i].push_back(i);
  84.             parent[i] = i;
  85.         }
  86.     }
  87.  
  88.     int get_parent(int vertex) {
  89.         if (parent[vertex] == vertex)
  90.             return vertex;
  91.         parent[vertex] = get_parent(parent[vertex]);
  92.         return parent[vertex];
  93.     }
  94.  
  95.     void joinSets(int m1, int m2) {
  96.         m1 = get_parent(m1);
  97.         m2 = get_parent(m2);
  98.         if (m1 != m2) {
  99.             parent[m2] = m1;
  100.             //v_cats[m1].insert(v_cats[m1].end(), v_cats[m2].begin(), v_cats[m2].end());
  101.             cnt--;
  102.             //v_cats[m2].clear();
  103.         }
  104.     }
  105. };
  106.  
  107.  
  108. int main() {
  109.     int n, m, k, a, b;
  110.     cin >> n >> m >> k;
  111.  
  112.     SNM snm;
  113.     snm.init(n);
  114.     vector<vector<int>> g(n);
  115.     vector<vector<int>> command(k, vector<int> (3));
  116.     for (int i = 0; i < m; i++){
  117.         cin >> a >> b;
  118.         g[a - 1].push_back(b - 1);
  119.     }
  120.  
  121.     for (int i = 0; i < k; i++){
  122.         string inp;
  123.         cin >> inp >> a >> b;
  124.         if (inp == "ask"){
  125.             command[k - 1 - i][0] = 1;
  126.             command[k - 1 - i][1] = a - 1;
  127.             command[k - 1 - i][2] = b - 1;
  128.         } else {
  129.  
  130.             command[k - 1 - i][0] = 2;
  131.             command[k - 1 - i][1] = a - 1;
  132.             command[k - 1 - i][2] = b - 1;
  133.         }
  134.     }
  135.  
  136.     vector<int> answer;
  137.     for (int i = 0; i < k; i++){
  138.         if (command[i][0] == 1){
  139.             if (snm.get_parent(command[i][1]) == snm.get_parent(command[i][2]))
  140.                 answer.push_back(1);
  141.             else{
  142.                 answer.push_back(0);
  143.             }
  144.         } else {
  145.             snm.joinSets(command[i][1], command[i][2]);
  146.         }
  147.     }
  148.  
  149.     for (int i = 0; i < answer.size(); i++){
  150.         if(answer[answer.size() - 1 - i] == 1)
  151.             cout << "YES" << endl;
  152.         else
  153.             cout << "NO" << endl;
  154.     }
  155.  
  156.     return 0;
  157. }
  158.  
  159. // 3
  160.  
  161. #include <iostream>
  162. #include <vector>
  163.  
  164. using namespace std;
  165.  
  166. struct Graph {
  167.     vector<int> color;
  168.     vector<vector<int>> g;
  169.     vector<int> answer;
  170.  
  171.     void init(int new_n) {
  172.         color.resize(new_n);
  173.         g.resize(new_n);
  174.     }
  175.  
  176.     void dfs(int v) {
  177.         color[v] = 1;
  178.         for (int i = 0; i < g[v].size(); i++) {
  179.             if (color[g[v][i]] == 1) {
  180.                 cout << "No";
  181.                 exit(0);
  182.             }
  183.             if (color[g[v][i]] == 0) {
  184.                 dfs(g[v][i]);
  185.             }
  186.         }
  187.         color[v] = 2;
  188.         answer.push_back(v + 1);
  189.     }
  190. };
  191.  
  192. int main() {
  193.     int n, m;
  194.     cin >> n >> m;
  195.  
  196.     Graph graph;
  197.     graph.init(n);
  198.  
  199.     for (int i = 0; i < m; i++) {
  200.         int a, b;
  201.         cin >> a >> b;
  202.         graph.g[a - 1].push_back(b - 1);
  203.     }
  204.     for (int i = 0; i < n; i++) {
  205.         if (graph.color[i] == 0) {
  206.             graph.dfs(i);
  207.         }
  208.     }
  209.     cout << "Yes" << endl;
  210.     for (int i = 0; i < n; i++) {
  211.         cout << graph.answer[n - 1 - i] << ' ';
  212.     }
  213.  
  214.     return 0;
  215. }
  216.  
  217. // 4
  218. #include <iostream>
  219. #include <vector>
  220.  
  221. using namespace std;
  222.  
  223. struct SNM {
  224.     int cnt;
  225.     vector<int> parent;
  226.     //vector<vector<int>> v_cats;
  227.  
  228.     void init(int n) {
  229.         cnt = n;
  230.         parent = vector<int>(n);
  231.         //v_cats = vector<vector<int>> (n);
  232.         for (int i = 0; i < n; i++) {
  233.             //v_cats[i].push_back(i);
  234.             parent[i] = i;
  235.         }
  236.     }
  237.  
  238.     int get_parent(int vertex) {
  239.         if (parent[vertex] == vertex)
  240.             return vertex;
  241.         parent[vertex] = get_parent(parent[vertex]);
  242.         return parent[vertex];
  243.     }
  244.  
  245.     void joinSets(int m1, int m2) {
  246.         m1 = get_parent(m1);
  247.         m2 = get_parent(m2);
  248.         if (m1 != m2) {
  249.             parent[m2] = m1;
  250.             //v_cats[m1].insert(v_cats[m1].end(), v_cats[m2].begin(), v_cats[m2].end());
  251.             cnt--;
  252.         }
  253.     }
  254. };
  255.  
  256.  
  257. int main() {
  258.     int n;
  259.     cin >> n;
  260.     SNM snm;
  261.     snm.init(n);
  262.     for (int i = 0; i < n; i++){
  263.         int a;
  264.         cin >> a;
  265.         snm.joinSets(i, a - 1);
  266.     }
  267.     cout << snm.cnt;
  268.  
  269.     return 0;
  270. }
  271.  
  272. // 7
  273. #include <iostream>
  274. #include <vector>
  275.  
  276. using namespace std;
  277.  
  278. struct Edge {
  279.     int dest;
  280.     int d_time;
  281.     int a_time;
  282.  
  283.     Edge(int to, int time1, int time2) { // конструктор
  284.         dest = to;
  285.         d_time = time1;
  286.         a_time = time2;
  287.     }
  288. };
  289.  
  290. struct Graph {
  291.  
  292.     int n;
  293.     vector<bool> used;
  294.     vector<vector<Edge>> g;
  295.     vector<int> dist;
  296.  
  297.     void init(int new_n){
  298.         n = new_n;
  299.         used.resize(new_n);
  300.         g.resize(new_n);
  301.         dist.resize(new_n, 1000000000);
  302.         dist[0] = 0;
  303.     }
  304.  
  305.     void dijkstra() {
  306.         while (true) {
  307.             int min_v = -1, min_dist = 1e9;
  308.             for (int i = 0; i < n; i++) {
  309.                 if (!used[i] && dist[i] < min_dist) {
  310.                     min_v = i;
  311.                     min_dist = dist[i];
  312.                 }
  313.             }
  314.             if (min_v == -1)
  315.                 return;
  316.             used[min_v] = true;
  317.             for (int i = 0; i < g[min_v].size(); i++) {
  318.                 if (g[min_v][i].a_time < dist[g[min_v][i].dest] && g[min_v][i].d_time >= dist[min_v])
  319.                     dist[g[min_v][i].dest] = g[min_v][i].a_time;
  320.             }
  321.         }
  322.     }
  323.  
  324. };
  325.  
  326. int main() {
  327.     int n, m, finish;
  328.     cin >> n >> finish >> m;
  329.  
  330.     Graph graph;
  331.     graph.init(n);
  332.  
  333.     for (int i = 0; i < m; i++) {
  334.         int k;
  335.         cin >> k;
  336.  
  337.         int from, to, old_time, new_time;
  338.         for (int j = 0; j < k; j++) {
  339.             cin >> to >> new_time;
  340.             to--;
  341.             if (j > 0) {
  342.                 graph.g[from].push_back(Edge(to, old_time, new_time));
  343.             }
  344.             from = to;
  345.             old_time = new_time;
  346.         }
  347.     }
  348.  
  349.  
  350.     graph.dijkstra();
  351.  
  352.     if (graph.dist[finish - 1] != 1e9)
  353.         cout << graph.dist[finish - 1];
  354.     else
  355.         cout << -1;
  356.  
  357.  
  358.     return 0;
  359. }
  360.  
  361. // 8
  362. #include <iostream>
  363. #include <vector>
  364.  
  365. using namespace std;
  366.  
  367. struct Edge {
  368.     int dest;
  369.     int d_time;
  370.     int a_time;
  371.  
  372.     Edge(int to, int time1, int time2) { // конструктор
  373.         dest = to;
  374.         d_time = time1;
  375.         a_time = time2;
  376.     }
  377. };
  378.  
  379. struct Graph {
  380.  
  381.     int n;
  382.     vector<bool> used;
  383.     vector<vector<Edge>> g;
  384.     vector<int> dist;
  385.  
  386.     void init(int new_n, int start){
  387.         n = new_n;
  388.         used.resize(new_n);
  389.         g.resize(new_n);
  390.         dist.resize(new_n, 1000000000);
  391.         dist[start] = 0;
  392.     }
  393.  
  394.     void dijkstra() {
  395.         while (true) {
  396.             int min_v = -1, min_dist = 1e9;
  397.             for (int i = 0; i < n; i++) {
  398.                 if (!used[i] && dist[i] < min_dist) {
  399.                     min_v = i;
  400.                     min_dist = dist[i];
  401.                 }
  402.             }
  403.             if (min_v == -1)
  404.                 return;
  405.             used[min_v] = true;
  406.             for (int i = 0; i < g[min_v].size(); i++) {
  407.                 if (g[min_v][i].a_time < dist[g[min_v][i].dest] && g[min_v][i].d_time >= dist[min_v])
  408.                     dist[g[min_v][i].dest] = g[min_v][i].a_time;
  409.             }
  410.         }
  411.     }
  412.  
  413. };
  414.  
  415. int main() {
  416.     int n, m, start, finish;
  417.     cin >> n;
  418.     cin >> start >> finish;
  419.     cin >> m;
  420.  
  421.     Graph graph;
  422.     graph.init(n, start - 1);
  423.  
  424.     for (int i = 0; i < m; i++) {
  425.         int from, to, old_time, new_time;
  426.         cin >> from >> old_time >> to >> new_time;
  427.         graph.g[from - 1].push_back(Edge(to - 1, old_time, new_time));
  428.     }
  429.  
  430.  
  431.     graph.dijkstra();
  432.  
  433.     if (graph.dist[finish - 1] != 1e9)
  434.         cout << graph.dist[finish - 1];
  435.     else
  436.         cout << -1;
  437.  
  438.  
  439.     return 0;
  440. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement