MAGCARI

God Of War

Nov 14th, 2022
895
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.36 KB | None | 0 0
  1. /*
  2.     Task    : _example
  3.     Author  : Phumipat C. [MAGCARI]
  4.     Language: C++
  5.     Created : 14 November 2022 [21:37]
  6. */
  7. #include<bits/stdc++.h>
  8. using namespace std;
  9. struct A{
  10.     int currentNode,sumDistance,usedTicket;
  11.     bool operator < (const A&o) const{
  12.         return sumDistance > o.sumDistance;
  13.     }
  14. };
  15. priority_queue<A > heap;
  16. struct B{
  17.     int nextNode,edgeWeight;
  18. };
  19. vector<B > g[100010];
  20. int dis[100010][2];
  21. int main(){
  22.     cin.tie(0)->sync_with_stdio(0);
  23.     cin.exceptions(cin.failbit);
  24.     int n,m,s,t,sum = 0;
  25.     cin >> n >> m >> s >> t;
  26.     for(int i=1;i<=m;i++){
  27.         int u,v,w;
  28.         cin >> u >> v >> w;
  29.         sum+=w;
  30.         g[u].push_back({v,w});
  31.         g[v].push_back({u,w});
  32.     }
  33.     for(int i=0;i<n;i++)
  34.         dis[i][0] = dis[i][1] = 1e9;
  35.     dis[s][0] = 0;
  36.     heap.push({s,0,0});
  37.     while(!heap.empty()){
  38.         A now = heap.top();
  39.         heap.pop();
  40.         if(now.currentNode == t && now.usedTicket == 1){
  41.             cout << sum-now.sumDistance << '\n';
  42.             break;
  43.         }
  44.         for(auto x:g[now.currentNode]){
  45.             //normal
  46.             if(dis[x.nextNode][now.usedTicket] > now.sumDistance + x.edgeWeight){
  47.                 dis[x.nextNode][now.usedTicket] = now.sumDistance + x.edgeWeight;
  48.                 heap.push({x.nextNode,now.sumDistance + x.edgeWeight, now.usedTicket});
  49.             }
  50.  
  51.             //special
  52.             if(now.usedTicket == 0 && dis[x.nextNode][now.usedTicket+1] > now.sumDistance){
  53.                 dis[x.nextNode][now.usedTicket+1] > now.sumDistance;
  54.                 heap.push({x.nextNode,now.sumDistance,now.usedTicket+1});
  55.             }
  56.         }
  57.     }
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment