Nik_Perepelov

Дополнительный контест для Насти

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