Advertisement
Pearlfromsu

some algos

Sep 29th, 2023
823
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.81 KB | None | 0 0
  1.            
  2. //АЛГОРИТМ ДЕЙКСТРЫ оптимальный
  3. const ll inf = 10000000000000ll;
  4.  
  5. int main()
  6. {
  7.     //freopen("input.txt", "r", stdin);
  8.     //freopen("rvq.out", "w", stdout);
  9.     cin.tie(NULL);
  10.     cout.tie(NULL);
  11.     ios_base::sync_with_stdio(false);
  12.     cout << fixed << setprecision(10);
  13.  
  14.     int n, m, a, b, w;
  15.     cin >> n >> m;
  16.     vector<vector<pair<int, int>>> edges(n);
  17.     vector<ll> dist(n, inf);
  18.     vector<int> prev(n);
  19.  
  20.  
  21.     int start = 0;
  22.     int ender = n - 1;
  23.     dist[start] = 0;
  24.  
  25.     for (int i = 0; i < m; i++) {
  26.         cin >> a >> b >> w;
  27.         a--, b--;
  28.         edges[a].push_back({ b, w });
  29.         edges[b].push_back({ a, w });
  30.     }
  31.     set<pair<ll, int> > s;
  32.     s.insert({ dist[start], start });
  33.     while (s.size() > 0) {
  34.         int v = s.begin()->second;
  35.         s.erase(s.begin());
  36.  
  37.         for (int i = 0; i < (int(edges[v].size())); ++i) {
  38.             int prvi = edges[v][i].first;
  39.             int w = edges[v][i].second;
  40.  
  41.             if (dist[v] + w < dist[prvi]) {
  42.                 s.erase({ dist[prvi], prvi });
  43.                 dist[prvi] = dist[v] + w;
  44.                 prev[prvi] = v;
  45.                 s.insert({ dist[prvi], prvi });
  46.             }
  47.         }
  48.     }
  49.     vector<int> way;
  50.     if (dist[ender] == inf)
  51.         cout << -1;
  52.     else {
  53.         int c = ender;
  54.         while (c != start) {
  55.             way.push_back(c);
  56.             c = prev[c];
  57.         }
  58.        
  59.         way.push_back(start);
  60.         for (int i = (way.size()) - 1; i >= 0; --i)
  61.             cout << (way[i]+1) << ' ';
  62.     }
  63.  
  64.     return 0;
  65. }
  66.            
  67.            
  68.            
  69.            
  70.            
  71.            
  72. СНМ(система непересекающихся множеств):
  73. //parent от 0 до n заполнить числами соответственно индексу 0...n
  74. void make_set (int v) {
  75.     parent[v] = v;
  76.     rank[v] = 0;
  77. }
  78.  
  79. int find_set (int v) {
  80.     if (v == parent[v])
  81.         return v;
  82.     return parent[v] = find_set (parent[v]);
  83. }
  84.  
  85. void union_sets (int a, int b) {
  86.     a = find_set (a);
  87.     b = find_set (b);
  88.     if (a != b) {
  89.         if (rank[a] < rank[b])
  90.             swap (a, b);
  91.         parent[b] = a;
  92.         if (rank[a] == rank[b])
  93.             ++rank[a];
  94.     }
  95. }
  96.            
  97.            
  98. //функция Эйлера(кол-во взаимнопростых с n чисел от 0 до n-1)
  99. int phi(int n){
  100.     int res = n;
  101.  
  102.     for (int i = 2; i * i <= n; ++i){
  103.         if (!(n % i)){
  104.             while(!(n % i)){
  105.                 n /= i;
  106.             }
  107.             res -= res/ i;
  108.         }
  109.     }
  110.  
  111.     if (n > 1)
  112.         res -= res / n;
  113.  
  114.     return res;
  115. }
  116.  
  117.  
  118. //z-функция - z[i] - наибольшее число символов, начиная с позиции i,
  119. //совпадающих с первыми символами строки s.
  120. vector<int> z_function (string s) {
  121.     int n = (int) s.length();
  122.     vector<int> z (n);
  123.     for (int i=1, l=0, r=0; i<n; ++i) {
  124.         if (i <= r)
  125.             z[i] = min (r-i+1, z[i-l]);
  126.         while (i+z[i] < n && s[z[i]] == s[i+z[i]])
  127.             ++z[i];
  128.         if (i+z[i]-1 > r)
  129.             l = i,  r = i+z[i]-1;
  130.     }
  131.     return z;
  132. }
  133.  
  134. //префикс функция - p[i] - длина наибольшего собственного суффикса подстроки s[0..i],
  135. //совпадающего с её префиксом
  136. vector<int> prefix_function(string s) {
  137.     int n = (int)s.length();
  138.     vector<int> pi(n);
  139.     for (int i = 1; i < n; i++) {
  140.         int j = pi[i-1];
  141.         while (j > 0 && s[i] != s[j])
  142.             j = pi[j-1];
  143.         if (s[i] == s[j])
  144.             j++;
  145.         pi[i] = j;
  146.     }
  147.     return pi;
  148. }
  149.    
  150. //Дерево Фенвика(почти как Дерево Отрезков) 
  151. T a[size];
  152. /* precondition: pos > 0 */
  153. void add(int pos, const T& val) {
  154.     while (pos < size) {
  155.         a[pos] += val;
  156.         pos += pos & -pos;
  157.     }
  158. }
  159. T sum(int pos) {
  160.     T ret = T();
  161.     while (pos > 0) {
  162.         ret += a[pos];
  163.         pos -= pos & -pos;
  164.     }
  165.     return ret;
  166. }
  167.        
  168.            
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement