Advertisement
Josif_tepe

Untitled

Dec 5th, 2022
523
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <cstring>
  4. #include <vector>
  5.  
  6.  
  7. using namespace std;
  8. struct node{
  9. int idx;
  10. int cost;
  11. int distance;
  12. int ostanata;
  13. node(){
  14.  
  15. }
  16. node(int idx2, int cost2, int distance2, int ostanato2){
  17. idx=idx2;
  18. cost=cost2;
  19. ostanata=ostanato2;
  20. distance=distance2;
  21. }
  22. bool operator < (const node &tmp)const{
  23. return cost > tmp.cost;
  24. }
  25. };
  26. int main()
  27. {
  28.  
  29.     int n, m, x, k, l;
  30.     cin>>n>>x>>k>>l>>m;
  31.  
  32.     vector<pair<int, int>>graph[n+5];
  33.  
  34.  
  35.  
  36.     for(int i=0; i<m; i++){
  37.     int a, b, c;
  38.     cin>>a>>b>>c;
  39.     graph[a].push_back(make_pair(b, c));
  40.         graph[b].push_back(make_pair(a, c));
  41.  
  42.     }
  43.  
  44.     int distance[n + 5][k + 5][l + 5];
  45.  
  46.     for(int i=0; i<=n; i++){
  47.      for(int j=0; j<=k; j++){
  48.         for(int z=0; z<=l; z++){
  49.         distance[i][j][z]=2e9;
  50.       }
  51.      }
  52.     }
  53.     priority_queue<node>p;
  54.     p.push(node(1, 0, l, k));
  55.     while(!p.empty()){
  56.         node c=p.top();
  57.         p.pop();
  58.  
  59.         int nova_distanca=c.distance;
  60.         if(c.idx<=x and c.distance > 0){
  61.             nova_distanca=0;
  62.         }
  63.         if(nova_distanca>0){
  64.         for(int i=0; i<graph[c.idx].size(); i++){
  65.             int sosed=graph[c.idx][i].first;
  66.                 int weight=graph[c.idx][i].second;
  67.                     if(nova_distanca-weight>=0 and c.cost<distance[sosed][c.ostanata][nova_distanca-weight]){
  68.                         distance[sosed][c.ostanata][nova_distanca-weight]=c.cost;
  69.                             p.push(node(sosed, c.cost, nova_distanca-weight, c.ostanata));
  70.                 }
  71.             }
  72.             nova_distanca = 0;
  73.         }
  74.         for(int j=0; j<graph[c.idx].size(); j++){
  75.             int sosed_=graph[c.idx][j].first;
  76.                 int weight_=graph[c.idx][j].second;
  77.                     if(c.cost+weight_ < distance[sosed_][c.ostanata][nova_distanca]){
  78.                         distance[sosed_][c.ostanata][nova_distanca]=c.cost + weight_;
  79.                             p.push(node(sosed_, c.cost+weight_, nova_distanca, c.ostanata));
  80.                     }
  81.                 }
  82.                 if(c.ostanata>0){
  83.                     c.ostanata--;
  84.                       nova_distanca=l;
  85.                       for(int i=0; i<graph[c.idx].size(); i++){
  86.                         int _sosed=graph[c.idx][i].first;
  87.                          int _weight=graph[c.idx][i].second;
  88.                           if(nova_distanca-_weight>=0 and c.cost<distance[_sosed][c.ostanata][nova_distanca-_weight]){
  89.                             distance[_sosed][c.ostanata][nova_distanca-_weight]=c.cost;
  90.                              p.push(node(_sosed, c.cost, nova_distanca-_weight, c.ostanata));
  91.                        }
  92.                       }
  93.                      }
  94.                     }
  95.                 int resultat=2e9;
  96.                 for(int i=0; i<=k; i++){
  97.                     for(int j=0; j<=l; j++){
  98.                         resultat=min(resultat, distance[n][i][j]);
  99.                     }
  100.                    }
  101.                 cout<<resultat;
  102.     return 0;
  103. }
  104.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement