Advertisement
K_Y_M_bl_C

Untitled

Oct 25th, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1. //#define _GLIBCXX_DEBUG
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8. typedef pair<int, int> pii;
  9. typedef vector<int> vi;
  10. typedef long double ld;
  11.  
  12. #define mk make_pair
  13. #define inb push_back
  14. #define X first
  15. #define Y second
  16. #define all(v) v.begin(), v.end()
  17. #define sqr(x) (x) * (x)
  18. #define TIME 1.0 * clock() / CLOCKS_PER_SEC
  19. #define y1 AYDARBOG
  20. //continue break pop_back return
  21.  
  22. int solve();
  23.  
  24. int main()
  25. {
  26.     //ios_base::sync_with_stdio(0);
  27.     //cin.tie(0);
  28. #define TASK "hamilton-cycle"
  29. #ifndef _DEBUG
  30.     //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  31. #endif
  32.     solve();
  33. #ifdef _DEBUG
  34.     fprintf(stderr, "\nTIME: %.3f\n", TIME);
  35. #endif
  36. }
  37.  
  38. const int BUFSZ = (int)1e6 + 7;
  39. char buf[BUFSZ];
  40. string get_str()
  41. {
  42.     scanf(" %s", buf);
  43.     return string(buf);
  44. }
  45.  
  46. typedef pair<pii, int> edge;
  47. const int INF = 1000000000;
  48. const int MID = 1000000;
  49.  
  50. int solve()
  51. {
  52.     int n, m;
  53.     scanf("%d %d", &n, &m);
  54.     vector<vector<pii>> g(n);
  55.     for (int i = 0; i < m; ++i)
  56.     {
  57.         int x, y, c;
  58.         scanf("%d %d %d", &x, &y, &c);
  59.         --x, --y;
  60.         g[x].inb(mk(y, c));
  61.         g[y].inb(mk(x, c));
  62.     }
  63.     vector<vi> d(n, vi(2, INF));
  64.     d[0][0] = 0;
  65.     set<pair<int, pii>> q;
  66.     q.insert(mk(0, mk(0, 0)));
  67.     while (!q.empty())
  68.     {
  69.         int u = q.begin()->Y.X;
  70.         int mod = q.begin()->Y.Y;
  71.         int dst = q.begin()->X;
  72.         q.erase(*q.begin());
  73.         for (pii eto : g[u])
  74.         {
  75.             int to = eto.X;
  76.             int t = eto.Y;
  77.             if (dst >= t)
  78.             {
  79.                 if (d[to][mod ^ 1] > dst + 1)
  80.                 {
  81.                     q.erase(mk(d[to][mod ^ 1], mk(to, mod ^ 1)));
  82.                     d[to][mod ^ 1] = dst + 1;
  83.                     q.insert(mk(d[to][mod ^ 1], mk(to, mod ^ 1)));
  84.                 }
  85.             }
  86.             else
  87.             {
  88.                 int w = t - dst;
  89.                 int f = w & 1;
  90.                 int f1 = dst & 1;
  91.                 if (f != f1)
  92.                     ++w;
  93.                 if (d[to][mod ^ 1] > dst + w + 1)
  94.                 {
  95.                     q.erase(mk(d[to][mod ^ 1], mk(to, mod ^ 1)));
  96.                     d[to][mod ^ 1] = dst + w + 1;
  97.                     q.insert(mk(d[to][mod ^ 1], mk(to, mod ^ 1)));
  98.                 }
  99.             }
  100.         }
  101.     }
  102.     /*for (int i = 0; i < n; ++i)
  103.     {
  104.         printf("%d %d\n", d[i][0], d[i][1]);
  105.     }*/
  106.     int ans = min(d[n - 1][0], d[n - 1][1]);
  107.     if (ans == INF)
  108.         puts("-1"), exit(0);
  109.     printf("%d\n", ans);
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement