Advertisement
TAImatem

Аврора Интенсив день4

Nov 25th, 2022
666
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.92 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #define _USE_MATH_DEFINES
  3. #include "stdio.h"
  4. #include "stdlib.h"
  5. #include "time.h"
  6. #include <cmath>
  7. #include <math.h>
  8. #include <algorithm>
  9. #include <map>
  10. #include <vector>
  11. #include <utility>
  12. #include <set>
  13. #include <string>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <fstream>
  17. #include <unordered_map>
  18. #include <unordered_set>
  19. #include <queue>
  20. #include <bitset>
  21. #include <cassert>
  22. #include <functional>
  23. //#include <intrin.h>
  24. #include <stack>
  25. #include <thread>
  26. using namespace std;
  27. //typedef long long ll;
  28. #define ll long long
  29. #define ld long double
  30.  
  31. const long long mod = 1000000007;
  32.  
  33. #define MIN(x,y) ((x)<(y)?(x):(y))
  34. #define MAX(x,y) ((x)>(y)?(x):(y))
  35. #define PI 3.14159265358979323846
  36. #define ABS(a) ((a)<0?-(a):(a))
  37. template <typename T> inline T gcd(T a, T b) {
  38.     while (b) { a %= b; swap(a, b); }
  39.     return a;
  40. }
  41. long long fastpow(long long a, long long n)
  42. {
  43.     auto mult = a;
  44.     long long res = 1;
  45.     while (n)
  46.     {
  47.         if (n & 1)
  48.             res *= mult;
  49.         mult *= mult;
  50.         n >>= 1;
  51.     }
  52.     return res;
  53. }
  54.  
  55. void LCS()
  56. {
  57.     string a, b;
  58.     cin >> a >> b;
  59.     vector<vector<int>> ans_matr(a.size() + 1);
  60.     ans_matr[0].resize(b.size() + 1, 0);
  61.     for (int i = 0; i < a.size(); i++)
  62.     {
  63.         ans_matr[i + 1].resize(b.size() + 1, 0);
  64.         for (int j = 0; j < b.size(); j++)
  65.             if (a[i] == b[j])
  66.                 ans_matr[i + 1][j + 1] = ans_matr[i][j] + 1;
  67.             else
  68.                 ans_matr[i + 1][j + 1] = max(ans_matr[i][j + 1], ans_matr[i + 1][j]);
  69.     }
  70.     cout << ans_matr[a.size()][b.size()] << endl;
  71.     string ans = "";
  72.     int i = a.size();
  73.     int j = b.size();
  74.     while (i && j)
  75.     {
  76.         while (i && ans_matr[i - 1][j] == ans_matr[i][j])
  77.             i--;
  78.         while (j && ans_matr[i][j - 1] == ans_matr[i][j])
  79.             j--;
  80.         if (i && j)
  81.         {
  82.             ans.push_back(a[i - 1]);
  83.             i--;
  84.             j--;
  85.         }
  86.     }
  87.     reverse(ans.begin(), ans.end());
  88.     cout << ans;
  89. }
  90.  
  91. void MaxPalindromeSubseq()
  92. {
  93.     string s;
  94.     cin >> s;
  95.     vector<vector<int>> matr_res(s.size());
  96.     for (int i = 0; i < s.size(); i++)
  97.     {
  98.         matr_res[i].resize(s.size() + 1, 0);
  99.         matr_res[i][i + 1] = 1;
  100.     }
  101.     for (int ni = 1; ni < s.size(); ni++)
  102.     {
  103.         for (int nj = ni; nj < s.size(); nj++)
  104.         {
  105.             int i = nj - ni;
  106.             int j = nj + 1;
  107.             if (s[i] == s[j - 1])
  108.             {
  109.                 matr_res[i][j] = matr_res[i + 1][j - 1] + 2;
  110.             }
  111.             else
  112.                 if (i < s.size() - 1)
  113.                     matr_res[i][j] = max(matr_res[i + 1][j], matr_res[i][j - 1]);
  114.                 else
  115.                     matr_res[i][j] = matr_res[i][j - 1];
  116.         }
  117.     }
  118.     string ans;
  119.     int i = 0, j = s.size();
  120.     while (matr_res[i][j])
  121.     {
  122.         while (matr_res[i][j - 1] == matr_res[i][j])
  123.             j--;
  124.         while (i < s.size() - 1 && matr_res[i + 1][j] == matr_res[i][j])
  125.             i++;
  126.         ans.push_back(s[i]);
  127.         j--;
  128.         i++;
  129.     }
  130.     string rev_ans = ans;
  131.     reverse(rev_ans.begin(), rev_ans.end());
  132.     if (matr_res[0][s.size()] % 2)
  133.     {
  134.         ans.pop_back();
  135.     }
  136.     cout << ans + rev_ans << endl;
  137. }
  138.  
  139. void Dijkstra()
  140. {
  141.     int n, m, a, b, c;
  142.     cin >> n >> m;
  143.     vector<int> dist(n, INT32_MAX), from(n, -1), passed(n, 0);
  144.     vector<vector<pair<int, int>>> neighbours(n);
  145.     dist[0] = 0;
  146.     for (int i = 0; i < m; i++)
  147.     {
  148.         cin >> a >> b >> c;
  149.         a--, b--;
  150.         neighbours[a].push_back({ b,c });
  151.         neighbours[b].push_back({ a,c });
  152.     }
  153.     for (int t = 0; t < n; t++)
  154.     {
  155.         int mindist = INT32_MAX;
  156.         int mini = -1;
  157.         for (int i = 0; i < n; i++)
  158.             if (!passed[i])
  159.             {
  160.                 if (dist[i] < mindist)
  161.                 {
  162.                     mindist = dist[i];
  163.                     mini = i;
  164.                 }
  165.             }
  166.         if (mini < 0)
  167.             break;
  168.         passed[mini] = 1;
  169.         for (auto& p : neighbours[mini])
  170.         {
  171.             if (dist[mini] + p.second < dist[p.first])
  172.             {
  173.                 dist[p.first] = dist[mini] + p.second;
  174.                 from[p.first] = mini;
  175.             }
  176.         }
  177.     }
  178.     cin >> a;
  179.     a--;
  180.     vector<int> v_ans;
  181.     int d_ans = dist[a];
  182.     v_ans.push_back(a);
  183.     while (from[a] >= 0)
  184.     {
  185.         v_ans.push_back(from[a]);
  186.         a = from[a];
  187.     }
  188.     reverse(v_ans.begin(), v_ans.end());
  189.     cout << d_ans << " " << v_ans.size() << endl;
  190.     for (auto& a : v_ans)
  191.         cout << a + 1 << " ";
  192.  
  193. }
  194.  
  195. void DijkstraFast()
  196. {
  197.     int n, m, a, b, c;
  198.     cin >> n >> m;
  199.     vector<int> dist(n, INT32_MAX), from(n, -1), passed(n, 0);
  200.     vector<vector<pair<int, int>>> neighbours(n);
  201.     dist[0] = 0;
  202.     for (int i = 0; i < m; i++)
  203.     {
  204.         cin >> a >> b >> c;
  205.         a--, b--;
  206.         neighbours[a].push_back({ b,c });
  207.         neighbours[b].push_back({ a,c });
  208.     }
  209.     set<pair<int, int>> nxt;
  210.     nxt.insert({ 0,0 });
  211.     for (int t = 0; t < n; t++)
  212.     {
  213.         if (nxt.empty())
  214.             break;
  215.         int mindist;
  216.         int mini;
  217.         tie(mindist, mini) = *(nxt.begin());
  218.         passed[mini] = 1;
  219.         for (auto& p : neighbours[mini])
  220.         {
  221.             if (dist[mini] + p.second < dist[p.first])
  222.             {
  223.                 if (dist[p.first] != INT32_MAX)
  224.                     nxt.erase({ dist[p.first],p.first });
  225.                 dist[p.first] = dist[mini] + p.second;
  226.                 from[p.first] = mini;
  227.                 nxt.insert({ dist[p.first],p.first });
  228.             }
  229.         }
  230.     }
  231.     cin >> a;
  232.     a--;
  233.     vector<int> v_ans;
  234.     int d_ans = dist[a];
  235.     v_ans.push_back(a);
  236.     while (from[a] >= 0)
  237.     {
  238.         v_ans.push_back(from[a]);
  239.         a = from[a];
  240.     }
  241.     reverse(v_ans.begin(), v_ans.end());
  242.     cout << d_ans << " " << v_ans.size() << endl;
  243.     for (auto& a : v_ans)
  244.         cout << a + 1 << " ";
  245.  
  246. }
  247.  
  248. void Ford_Bellman(int v, int u, int n, vector<pair<pair<int, int>, int>> edges)
  249. {
  250.     vector<int> d(n, INT32_MAX);
  251.     vector<int> p(n, -1);
  252.     d[v] = 0;
  253.     int i = 0;
  254.     int change = -1;
  255.     for (; i < n; i++)
  256.     {
  257.         change = -1;
  258.         for (auto& a : edges)
  259.         {
  260.             if (d[a.first.first] != INT32_MAX && d[a.first.first] + a.second < d[a.first.second])
  261.             {
  262.                 change = a.first.second;
  263.                 p[a.first.second] = a.first.first;
  264.                 d[a.first.second] = d[a.first.first] + a.second;
  265.             }
  266.         }
  267.         if (change < 0)
  268.             break;
  269.     }
  270.     if (i == n)
  271.     {
  272.         cout << "negative loop detected" << endl;//цикл можно восстановить если использовать p как рёбра графа и искать цикл обходом из change
  273.         return;
  274.     }
  275.     if (d[u] == INT32_MAX)
  276.     {
  277.         cout << "destination unreachable" << endl;
  278.         return;
  279.     }
  280.     cout << d[u] << ' ';
  281.     vector<int> ans = { u };
  282.     int c = u;
  283.     while (p[c] >= 0)
  284.     {
  285.         ans.push_back(p[c]);
  286.         c = p[c];
  287.     }
  288.     cout << ans.size() << endl;
  289.     reverse(ans.begin(), ans.end());
  290.     for (auto& a : ans)
  291.         cout << a << ' ';
  292. }
  293.  
  294. int start = -1;
  295. vector<int>  cycle;
  296.  
  297. void FindCycle(vector<vector<bool>>& matr, vector<bool>& passed, int i)
  298. {
  299.     passed[i] = true;
  300.     for (int j = 0; j < matr[i].size(); j++)
  301.     {
  302.         if (matr[i][j])
  303.         {
  304.             if (!passed[j])
  305.             {
  306.                 FindCycle(matr, passed, j);
  307.             }
  308.             else
  309.             {
  310.                 start = j;
  311.             }
  312.         }
  313.  
  314.         if (start >= 0)
  315.         {
  316.             cycle.push_back(i);
  317.             if (start == i)
  318.             {
  319.                 start = -1;
  320.             }
  321.             return;
  322.         }
  323.         if (cycle.size())
  324.             return;
  325.     }
  326. }
  327.  
  328. vector<vector<int>> d;
  329. vector<vector<int>> p;
  330. int n;
  331. void Floyd_Warshall()//INT32_MAX
  332. {
  333.     for (int t = 0; t < n; t++)
  334.         for (int i = 0; i < n; i++)
  335.             for (int j = 0; j < n; j++)
  336.                 if (d[i][t] != INT32_MAX && d[t][j] != INT32_MAX)
  337.                 {
  338.                     if (d[i][t] + d[t][j] < d[i][j])
  339.                     {
  340.                         d[i][j] = d[i][t] + d[t][j];
  341.                         p[i][j] = t;
  342.                     }
  343.                 }
  344. }
  345.  
  346. void GetFloyd_WarshallPath(vector<int>& path, int i, int j)
  347. {
  348.     if (p[i][j] < 0)
  349.         return;
  350.     GetFloyd_WarshallPath(path, i, p[i][j]);
  351.     path.push_back(p[i][j]);
  352.     GetFloyd_WarshallPath(path, p[i][j], j);
  353. }
  354.  
  355. void GetFloyd_WarshallPathStart(vector<int>& path, int i, int j)
  356. {
  357.     path.push_back(i);
  358.     GetFloyd_WarshallPath(path, i, j);
  359.     path.push_back(j);
  360. }
  361.  
  362. bool CheckIfBinaryGraph(vector<vector<bool>>& matr, vector<int>& passed)
  363. {
  364.     queue<int> que;
  365.     passed.clear();
  366.     passed.resize(matr.size(), -1);
  367.     for (int i = 0; i < matr.size(); i++)
  368.     {
  369.         que.push(i);
  370.         passed[i] = 0;
  371.         while (que.size())
  372.         {
  373.             int ti = que.front();
  374.             que.pop();
  375.             for (int j = 0; j < matr[ti].size(); j++)
  376.                 if (matr[ti][j])
  377.                     if (passed[j] < 0)
  378.                     {
  379.                         passed[j] = 1 - passed[ti];
  380.                         que.push(j);
  381.                     }
  382.                     else
  383.                         if (passed[ti] == passed[j])
  384.                             return false;
  385.         }
  386.     }
  387.     return true;
  388. }
  389.  
  390. int main() {
  391. #ifdef DEBUG
  392.     freopen("input.txt", "r", stdin);
  393.     //freopen("output.txt", "w", stdout);
  394. #endif
  395.     Dijkstra();
  396.     return 0;
  397. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement