Advertisement
mickypinata

SMMR-T154: Journey

Mar 26th, 2020
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5. typedef long long lli;
  6.  
  7. typedef struct edge{
  8.     int v;
  9.     lli w;
  10.     bool operator < (const edge &rhs)const{
  11.         return w > rhs.w;
  12.     }
  13. }edge;
  14.  
  15. vector<vector<edge>> adj;
  16. int nv, ne;
  17. lli lim;
  18.  
  19. int Dijkstra(int start){
  20.     priority_queue<edge> q;
  21.     vector<bool> visited(nv + 1, false);
  22.     vector<lli> dist(nv + 1, 1e18);
  23.     int mx = 1;
  24.     visited[start] = true;
  25.     dist[start] = 0;
  26.     q.push({start, dist[start]});
  27.     while(!q.empty()){
  28.         edge tmp;
  29.         tmp.v = q.top().v;
  30.         tmp.w = q.top().w;
  31.         q.pop();
  32.         if(visited[tmp.v] && tmp.v != start){
  33.             continue;
  34.         }
  35.         visited[tmp.v] = true;
  36.         if(dist[tmp.v] <= lim){
  37.             mx = max(mx, tmp.v);
  38.         }
  39.         for(auto nxt : adj[tmp.v]){
  40.             if(!visited[nxt.v] && dist[tmp.v] + nxt.w < dist[nxt.v]){
  41.                 dist[nxt.v] = dist[tmp.v] + nxt.w;
  42.                 q.push({nxt.v, dist[nxt.v]});
  43.             }
  44.         }
  45.     }
  46.     return mx;
  47. }
  48.  
  49. int main(){
  50.  
  51.     int u, v, w;
  52.  
  53.     scanf("%d %d %lld", &nv, &ne, &lim);
  54.     adj.assign(nv + 1, vector<edge>());
  55.     for(int i = 1; i <= ne; ++i){
  56.         scanf("%d %d %d", &u, &v, &w);
  57.         adj[u].push_back({v, w});
  58.         adj[v].push_back({u, w});
  59.     }
  60.     cout << Dijkstra(1);
  61.  
  62.     return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement