Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #define pb push_back
  4. #define mk make_pair
  5. #define pii pair<int,int>
  6. #define S second
  7. #define F first
  8. #include <algorithm>
  9. using namespace std;
  10. int n,m,bf[3],lt=1;vector<pii>a;vector<int> d,p;vector<vector<pii>>nt;
  11. void swap(int q,int k) {
  12.     pii ep=a[q];
  13.     a[q]=a[k]; a[k]=ep;
  14.     #define done job
  15. }
  16. pii pop_top() {
  17.     pii res=a[1];
  18.     a[1]=a[lt-1];
  19.     int i=0;bool q,k;
  20.     while ((q=a[i*2+1]<a[i])||(k=a[i*2]<a[i])) {
  21.         if (q) {
  22.             swap(i*2+1,i); i=i*2+1;
  23.         }
  24.         else if (k) {
  25.             swap(i*2,i); i*=2;
  26.         }
  27.     }
  28.     --lt;
  29.     return res;
  30. }
  31. int pred(int h) {
  32.     if (h&1) return (h-1)/2;
  33.     return h/2;
  34. }
  35. void add(pii p) {
  36.     a[lt]=p;
  37.     int i=lt;
  38.     while (a[pred(i)]>a[i]) {
  39.         swap(pred(i),i);i=pred(i);
  40.     }
  41.     ++lt;
  42. }
  43. int main() {
  44.     // F - расстояние до вершины, S - номер вершины
  45.     scanf("%d%d",&n,&m);a.resize(n+1);d.resize(n,-1);p.resize(n);nt.resize(n);
  46.     for (int i=0;i<m;++i) {
  47.         scanf("%d%d%d", &bf[0],&bf[1],&bf[2]);--bf[1];--bf[0];
  48.         nt[bf[0]].pb(mk(bf[2],bf[1]));nt[bf[1]].pb(mk(bf[2],bf[0]));
  49.     }
  50.     add(mk(0,0));d[0]=0;p[0]=-1488;
  51.     for (int i=0;i<n;++i) {
  52.         pii v=pop_top();
  53.         for (int j=0;j<nt[v.S].size();++j) {
  54.             pii to=nt[v.S][j];
  55.             if (d[to.S]==-1 || d[to.S]>d[v.S]+to.F) {
  56.                 d[to.S]=(d[to.S]==-1)? v.F+to.F : v.F+to.F;
  57.                 p[to.S]=v.S;
  58.                 to.F=d[to.S];
  59.                 add(to);
  60.             }
  61.         }
  62.     }
  63.     n-=1;
  64.     vector<int>ans;
  65.     while (p[n]!=-1488) {
  66.         //printf("%d ",n+1);
  67.         ans.pb(n+1);
  68.         n=p[n];
  69.     }
  70.     //puts("1");
  71.     ans.pb(1);
  72.     reverse(ans.begin(),ans.end());
  73.     for (int i=0;i<ans.size();++i) {
  74.         printf("%d ",ans[i]);
  75.     }
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement