Advertisement
Josif_tepe

Untitled

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