DSA
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.3 KiB

  1. #include <bits/stdc++.h>
  2. using namespace std ;
  3. const long long MaxN = 1e6 + 17;
  4. const long long INF = 1e14 + 17;
  5. long long n , m ;
  6. vector <pair<int,int> > g[MaxN] ;
  7. set <pair<int,int> > S ;
  8. long long s , f ;
  9. long long d[MaxN] ;
  10. int main ()
  11. {
  12. scanf ("%d%d", &n, &m);
  13. s = 1 ;
  14. for (int i = 1; i <= m; ++ i) {
  15. int x, y, w;
  16. scanf ("%d%d%d", &x, &y, &w);
  17. g[x].push_back (make_pair (y, w));
  18. g[y].push_back (make_pair (x, w));
  19. }
  20. for (int i = 1 ; i <= n ; ++i)
  21. d[i] = INF ;
  22. d[s] = 0 ;
  23. vector<int> p(n+1) ;
  24. S.insert (make_pair (0,s)) ;
  25. while (!S.empty()) {
  26. int v = S.begin() -> second;
  27. S.erase (*S.begin());
  28. for (int i = 0 ; i < g[v].size() ; ++ i) {
  29. int to = g[v][i].first;
  30. int w = g[v][i].second;
  31. if (d[v] + w < d[to])
  32. {
  33. S.erase(make_pair(d[to] , to)) ;
  34. d[to] = d[v] + w ;
  35. p[to] = v ;
  36. S.insert(make_pair(d[to] , to)) ;
  37. }
  38. }
  39. }
  40. if(d[n] == INF)
  41. return (cout << -1 , 0) ;
  42. vector<int> ans ;
  43. for(int v = n ; v != 1 ; v = p[v])
  44. {
  45. if(p[v] == 0)
  46. return(cout << -1,0) ;
  47. ans.push_back(v) ;
  48. }
  49. ans.push_back(1) ;
  50. for(int i = ans.size() - 1 ; i >= 0 ; --i)
  51. cout << ans[i] << ' ' ;
  52. }