Advertisement
Korotkodul

СПБГУ_A

Dec 22nd, 2021 (edited)
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <string>
  7. #include <stack>
  8. #include <set>
  9. #include <map>
  10. #define pii pair <int,int>
  11. using namespace std;
  12. /*
  13. решение:
  14. 1)сделать граф
  15. 2)найти мин гамильтонов путь
  16. 3) ответ = мин гамильтонов путь + расстояние, чтобы дойти до стартовой вершины этого пути
  17.  
  18.  
  19. ЕСЛИ ТАКОЕ НЕ ЗАЙДЁТ хотя бы на 90 баллов:
  20. )посчитать за О(n^2), из какой вершины выгоднее стартовать = вершина start
  21. )посчитать минимальные гамильтоновы пути из каждой вершины
  22. )перебрать все сочетания за O(n) : (x, y), где x - длина пути до стартовой вершины, y - длина мин гамильтонова пути
  23.  
  24. */
  25. using ll = long long;
  26. using ld = long double;
  27. void cv(vector <int> &v){
  28.     for (auto x: v) cout<<x<<' ';
  29.     cout<<"\n\n";
  30. }
  31. int N;
  32. int inf = 2e9;
  33. vector <int> a, b;
  34. vector <vector <int>> G;
  35. void cg(){
  36.     for (int i = 0; i < N; ++i){
  37.         for (int j = 0; j < N; ++j){
  38.             cout<<"("<<i+1<<","<<j+1<<") = "<<G[i][j]<<"\n";
  39.         }cout<<"\n";
  40.     }cout<<"\n";
  41. }
  42. int mk(int x, int y){
  43.     int idx, idy, r = 0;
  44.     for (int i=0;i<N;++i){
  45.         if (a[i] == x){
  46.             idx = i;
  47.         }
  48.         else if (a[i] == y){
  49.             idy = i;
  50.         }
  51.     }
  52.     r += abs(idx - idy);
  53.  
  54.     for (int i=0;i<N;++i){
  55.         if (b[i] == x){
  56.             idx = i;
  57.         }
  58.         else if (b[i] == y){
  59.             idy = i;
  60.         }
  61.     }
  62.     r += abs(idx - idy);
  63.     return r;
  64. }
  65.  
  66. struct edge{
  67.     int a,b,w;
  68. };
  69. void ced(edge x){
  70.     cout<<x.a+1<<' '<<x.b+1<<' '<<x.w<<"\n";
  71. }
  72. bool cmp(edge a, edge b){
  73.     return a.w < b.w;
  74. }
  75.  
  76. vector <edge> Edges;
  77.  
  78. void krasc(){
  79.  
  80. }
  81.  
  82.  
  83. void kras(){
  84.  
  85. }
  86. int main()
  87. {
  88.     ios::sync_with_stdio(0);
  89.     cin.tie(0);
  90.     cout.tie(0);
  91.     cin>>N;
  92.     G.resize(N, vector <int> (N, inf));
  93.     a.resize(N, inf); b.resize(N, inf);
  94.     for (int i = 0; i < N; ++i){
  95.         int inb; cin>>inb; inb--;
  96.         cout<<"inb = "<<inb<<"\n";
  97.         a[i] = i;
  98.         b[inb] = i;
  99.     }
  100.     cv(a);
  101.     cv(b);
  102.     for (int i = 0; i < N; ++i){
  103.         for (int j = 0; j != i && j < N; ++j){
  104.             G[i][j] = G[j][i] = mk(i, j);
  105.             edge sm = {i, j, G[i][j]};
  106.             Edges.push_back(sm);
  107.         }
  108.     }
  109.     cg();
  110.     sort(Edges.begin(), Edges.end(), cmp);
  111.     for (auto x: Edges){
  112.         ced(x);
  113.     }
  114.     kras();
  115. }
  116. /*
  117. 6
  118. 3 6 4 1 5 2
  119. */
  120.  
  121.  
  122.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement