Advertisement
Josif_tepe

Untitled

Feb 14th, 2022
1,041
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. struct node
  7. {
  8.     int idx;
  9.     long long cost;
  10.     int pop;
  11.     node(){}
  12.     node(int _idx, long long _cost, int _pop)
  13.     {
  14.         idx=_idx;
  15.         cost=_cost;
  16.         pop=_pop;
  17.     }
  18.     bool operator <(const node &tmp)const
  19.     {
  20.         return cost>tmp.cost;
  21.     }
  22. };
  23. vector<pair<int,long long>>par[100005];
  24. long long dis[100005][2];
  25.  
  26. int main()
  27. {
  28.     ios_base::sync_with_stdio(false);
  29.     long long a,b,x,y,z;
  30.     cin>>a>>b;
  31.     int i, j;
  32.    
  33.     for( i=0;i<b;i++)
  34.     {
  35.         cin>>x>>y>>z;
  36.         par[x].push_back({y,z});
  37.     }
  38.     priority_queue<node>Q;
  39.     Q.push(node(1,0,0));
  40.     for( i=0;i<=a;i++)
  41.     {
  42.         for( j=0;j<2;j++)
  43.         {
  44.             dis[i][j]=1e18;
  45.         }
  46.     }
  47.     long long sosed, r;
  48.     dis[1][0]=0;
  49.     dis[1][1] = 0;
  50.     while(!Q.empty())
  51.     {
  52.         node teme=Q.top();
  53.         Q.pop();
  54.        
  55.         if(teme.cost > dis[teme.idx][teme.pop]) continue;
  56.         for( i=0;i<par[teme.idx].size();i++)
  57.         {
  58.              sosed=par[teme.idx][i].first;
  59.              r = par[teme.idx][i].second;
  60.             if(teme.pop==0)
  61.             {
  62.                 if(r + teme.cost<dis[sosed][teme.pop])
  63.                 {
  64.                     dis[sosed][teme.pop]=r+teme.cost;
  65.                     Q.push(node(sosed,dis[sosed][teme.pop],teme.pop));
  66.                 }
  67.                 if((r/2) + teme.cost<dis[sosed][1])
  68.                 {
  69.                     dis[sosed][1]=r/2 + teme.cost;
  70.                     Q.push(node(sosed,dis[sosed][1],1));
  71.                 }
  72.             }
  73.             else if(teme.pop==1)
  74.             {
  75.                 if(r+teme.cost<dis[sosed][teme.pop])
  76.                 {
  77.                     dis[sosed][teme.pop]=r+teme.cost;
  78.                     Q.push(node(sosed,dis[sosed][teme.pop],teme.pop));
  79.                 }
  80.             }
  81.         }
  82.     }
  83.     cout << min(dis[a][0], dis[a][1]) << endl;
  84.     return 0;
  85. }
  86.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement