Advertisement
MinhNGUYEN2k4

mele3

Mar 24th, 2021
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.66 KB | None | 0 0
  1. ///Nguyen Huu Hoang Minh
  2. #include <bits/stdc++.h>
  3. #define sz(x) int(x.size())
  4. #define all(x) x.begin(),x.end()
  5. #define reset(x) memset(x, 0,sizeof(x))
  6. #define pb push_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define N 50005
  11. #define remain(x) if (x > MOD) x -= MOD
  12. #define ii pair<int, int>
  13. #define iiii pair< ii , ii >
  14. #define viiii vector< iiii >
  15. #define vi vector<int>
  16. #define vii vector< ii >
  17. #define bit(x, i) (((x) >> (i)) & 1)
  18. #define Task "test"
  19. #define int long long
  20.  
  21. using namespace std;
  22.  
  23. typedef long double ld;
  24. const int inf = 1e10;
  25. const int minf = -1e10;
  26.  
  27. int k, n;
  28. vector<int> a[N];
  29.  
  30. void readfile()
  31. {
  32.     ios_base::sync_with_stdio(false);
  33.     cin.tie(0);cout.tie(0);
  34.     if (fopen(Task".inp","r"))
  35.     {
  36.         freopen(Task".inp","r",stdin);
  37.         //freopen(Task".out","w",stdout);
  38.     }
  39.     cin >> k >> n;
  40.     for(int i=1; i<=n; i++)
  41.     {
  42.         int u, v;
  43.         cin >> u >> v;
  44.         a[u].pb(v);
  45.         a[v].pb(u);
  46.     }
  47. }
  48.  
  49. int d[1005];
  50. ///d[i] là thời gian ngắn nhất để đi từ tầng 1 đến tầng i
  51. ///d[i] = +oo, d[1] = 0
  52.  
  53. void dijkstra()
  54. {
  55.     for(int i=2; i<=k; i++) d[i] = inf;
  56.     priority_queue<ii, vii, greater<ii>> q;
  57.     q.push(ii(d[1],1));
  58.     while (q.size())
  59.     {
  60.         int u = q.top().se;
  61.         int du = q.top().fi;
  62.         q.pop();
  63.         if (d[u] != du) continue;
  64.         int duu;
  65.         for(auto v : a[u])
  66.         {
  67.             int dis = abs(u-v);
  68.             ///dis là thời gian di chuyển giữa tầng u và v
  69.             ///du là thời gian ngắn nhất để dến tầng u
  70.             ///ta cần đi từ tầng u đến tầng v
  71.  
  72.             ///Gọi duu là thời gian để thang máy u-v đi đến tầng u
  73.             ///du % dis == 0 tức là thang máy đang ở 1 trong hai đầu, nếu số lần đi lên xuống (du / dis) là chẵn tức là thang máy đang ở lầu dưới, lẻ là ở lầu trên
  74.             ///Xét trường hợp u < v thì ta cần đi lên, nếu thang máy đang ở lầu dưới thì thời gian cần để thang máy đến u là du
  75.             ///còn nếu thang máy đang ở lầu trên thì thời gian cần để chờ thang máy tới là du + dis
  76.  
  77.             ///du % dis != 0 tức là thang máy đang đi đến giữa đường, nếu du/dis là lẻ tức là thang máy đang đi từ v về u
  78.             ///-> du/dis*dis là thời gian để thang máy đến v và cộng thêm dis là thời gian thang máy đi về u
  79.  
  80.             ///nếu du/dis chẵn tức là thang máy đã đi qua u và đang đi lên lại v
  81.             ///-> du/dis*dis là thời gian để thang máy đến u và cộng thêm dis*2 là thời gian thang máy đi lên lại v và về lại u.
  82.  
  83.             ///trường hợp u > v thì ngược lại (vì ta cần đi xuống dưới)
  84.             if (u < v)
  85.             {
  86.                 if (du % dis == 0) duu = ((du/dis)&1) ? du + dis : du;
  87.                 else{
  88.                     if ((du/dis)&1) duu = du/dis*dis+dis;
  89.                     else duu = du/dis*dis+dis+dis;
  90.                 }
  91.             }
  92.             else{
  93.                 if (du % dis == 0) duu = ((du/dis)&1) ? du : du + dis;
  94.                 else{
  95.                     if ((du/dis)&1) duu = du/dis*dis + 2*dis;
  96.                     else duu = du/dis*dis+dis;
  97.                 }
  98.             }
  99.             if (d[v] > duu + dis)
  100.             {
  101.                 d[v] = duu + dis;
  102.                 q.push(ii(d[v],v));
  103.             }
  104.         }
  105.     }
  106. }
  107. void proc()
  108. {
  109.     dijkstra();
  110.     cout << d[k]*5 << endl;
  111. }
  112.  
  113. signed main()
  114. {
  115.     readfile();
  116.     proc();
  117.     return 0;
  118. }
  119.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement