Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <queue>
- #include <tuple>
- using namespace std;
- #define lli long long
- #define tlii tuple<lli, int, int>
- #define pii pair<int, int>
- #define f first
- #define s second
- vector<vector<pii>> adj;
- int nv, ne, limit, sc;
- int main(){
- int u, v, w;
- scanf("%d %d %d %d", &nv, &ne, &sc, &limit);
- adj.assign(nv + 1, vector<pii>());
- for(int i = 1; i <= ne; ++i){
- scanf("%d %d %d", &u, &v, &w);
- adj[u].emplace_back(v, w);
- adj[v].emplace_back(u, w);
- }
- /// Dijkstra State Graph
- vector<vector<bool>> visited(nv + 1, vector<bool>(2, false)); /// State: 1 = Skill 0 = Used
- vector<vector<lli>> dist(nv + 1, vector<lli>(2, 1e18));
- priority_queue<tlii, vector<tlii>, greater<tlii>> q;
- dist[1][1] = 0;
- q.emplace(dist[1][1], 1, 1);
- while(!q.empty()){
- int u = get<1>(q.top());
- int st = get<2>(q.top());
- q.pop();
- if(u == nv){
- if(dist[u][st] > limit){
- cout << "No Honey TT";
- } else {
- cout << "Happy Winnie the Pooh :3\n" << dist[u][st];
- }
- return 0;
- }
- if(visited[u][st]){
- continue;
- }
- visited[u][st] = true;
- for(auto next : adj[u]){
- int v = next.f;
- int w = next.s;
- if(st == 1 && !visited[v][0] && dist[u][1] + sc < dist[v][0]){
- dist[v][0] = dist[u][1] + sc;
- q.emplace(dist[v][0], v, 0);
- }
- if(!visited[v][st] && dist[u][st] + w < dist[v][st]){
- dist[v][st] = dist[u][st] + w;
- q.emplace(dist[v][st], v, st);
- }
- }
- }
- cout << "No Honey TT";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement