Advertisement
mickypinata

CUBE-T228: Magic Pooh

May 26th, 2020
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <tuple>
  5. using namespace std;
  6.  
  7. #define lli long long
  8. #define tlii tuple<lli, int, int>
  9. #define pii pair<int, int>
  10. #define f first
  11. #define s second
  12.  
  13. vector<vector<pii>> adj;
  14. int nv, ne, limit, sc;
  15.  
  16. int main(){
  17.  
  18.     int u, v, w;
  19.  
  20.     scanf("%d %d %d %d", &nv, &ne, &sc, &limit);
  21.     adj.assign(nv + 1, vector<pii>());
  22.     for(int i = 1; i <= ne; ++i){
  23.         scanf("%d %d %d", &u, &v, &w);
  24.         adj[u].emplace_back(v, w);
  25.         adj[v].emplace_back(u, w);
  26.     }
  27.  
  28.     /// Dijkstra State Graph
  29.     vector<vector<bool>> visited(nv + 1, vector<bool>(2, false)); /// State: 1 = Skill 0 = Used
  30.     vector<vector<lli>> dist(nv + 1, vector<lli>(2, 1e18));
  31.     priority_queue<tlii, vector<tlii>, greater<tlii>> q;
  32.     dist[1][1] = 0;
  33.     q.emplace(dist[1][1], 1, 1);
  34.     while(!q.empty()){
  35.         int u = get<1>(q.top());
  36.         int st = get<2>(q.top());
  37.         q.pop();
  38.         if(u == nv){
  39.             if(dist[u][st] > limit){
  40.                 cout << "No Honey TT";
  41.             } else {
  42.                 cout << "Happy Winnie the Pooh :3\n" << dist[u][st];
  43.             }
  44.             return 0;
  45.         }
  46.         if(visited[u][st]){
  47.             continue;
  48.         }
  49.         visited[u][st] = true;
  50.         for(auto next : adj[u]){
  51.             int v = next.f;
  52.             int w = next.s;
  53.             if(st == 1 && !visited[v][0] && dist[u][1] + sc < dist[v][0]){
  54.                 dist[v][0] = dist[u][1] + sc;
  55.                 q.emplace(dist[v][0], v, 0);
  56.             }
  57.             if(!visited[v][st] && dist[u][st] + w < dist[v][st]){
  58.                 dist[v][st] = dist[u][st] + w;
  59.                 q.emplace(dist[v][st], v, st);
  60.             }
  61.         }
  62.     }
  63.  
  64.     cout << "No Honey TT";
  65.     return 0;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement