Advertisement
tepyotin2

Investigation

Jun 10th, 2025
629
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5.  
  6. const long long V = 1e18;
  7. const long long MOD = 1e9+7;
  8.  
  9. struct Edge{
  10.     int to;
  11.     ll val;
  12. };
  13.  
  14. struct Node{
  15.     int node;
  16.     ll weight;
  17.     //ll count;
  18.     bool operator>(const Node &a) const{
  19.         return weight>a.weight;
  20.     }
  21. };
  22.  
  23. int n, m;
  24. vector<vector<Edge>> con;
  25. priority_queue<Node, vector<Node>, greater<Node>> pq;
  26. vector<ll> dist;
  27. //vector<vector<ll>> sizes;
  28. //ll mod = 1e9+7;
  29. //ll mn_flight[100001];
  30. //ll mx_flight[100001];
  31. //ll way[100001];
  32. //ll v = 1e18;
  33.  
  34. int main(){
  35.     //freopen("investigation.in", "r", stdin);
  36.    
  37.     cin >> n >> m;
  38.     con.resize(n+1);
  39.     dist.resize(n+1, V);
  40.     //sizes.resize(n+1);
  41.     //memset(mn_flight, v, sizeof(mn_flight));
  42.     vector<int> mn_flight(n+1, INT_MAX);
  43.     vector<int> mx_flight(n+1, 0);
  44.     vector<ll> way(n+1, 0);
  45.     for(int i=0; i<m; i++){
  46.         int a, b;
  47.         ll c;
  48.         cin >> a >> b >> c;
  49.         con[a].push_back({b, c});
  50.     }
  51.     pq.push({1, 0});
  52.     dist[1] = 0;
  53.     way[1] = 1;
  54.     mn_flight[1] = 0;
  55.     while(!pq.empty()){
  56.         Node cur = pq.top();
  57.         pq.pop();
  58.         int node = cur.node;
  59.         ll weight = cur.weight;
  60.         if(weight>dist[node]) continue;
  61.         //cout << "node: " << node << ", weight: " << weight << ", dist: " << dist[node] << ", way: " << way[node] << '\n';
  62.         //way[node]++;
  63.         //way[node] = way[node]%MOD;
  64.         //sizes[node].push_back(cur.count);
  65.         for(Edge v: con[node]){
  66.             if(dist[v.to]>dist[node]+v.val){
  67.                 dist[v.to] = dist[node]+v.val;
  68.                 pq.push({v.to, dist[v.to]});
  69.                 way[v.to] = way[node];
  70.                 //cout << "1: " << "node: " << node << ", to: " << v.to << ", dist[node]: " << dist[node] << ", way[v.to]: " << way[v.to] << '\n';
  71.                 //way[v.to]++;
  72.                 mn_flight[v.to] = mn_flight[node]+1;
  73.                 mx_flight[v.to] = mx_flight[node]+1;
  74.             }else if(dist[v.to] == dist[node]+v.val){
  75.                 //sizes[v.to].push_back(cur.count+1);
  76.                 //pq.push({v.to, dist[v.to]});
  77.                 //!!!Must not push same values into priority queue because way values
  78.                 //will be doubled for absolutely no reason at all
  79.                 //cout << "2: " << "node: " << node << ", to: " << v.to << ", way[node]: " << way[node] << ", way[v.to]: " << way[v.to] << '\n';
  80.                 //cout << "dist[v.to]: " << dist[v.to] << ", " << "dist[node]+v.val: " << dist[node]+v.val << '\n';
  81.                 way[v.to] = (way[node]+way[v.to])%MOD;
  82.                 mn_flight[v.to] = min(mn_flight[v.to], mn_flight[node]+1);
  83.                 mx_flight[v.to] = max(mx_flight[v.to], mx_flight[node]+1);
  84.             }
  85.         }
  86.     }
  87.     cout << dist[n] << " ";
  88.     cout << way[n] << " ";
  89.     //sort(sizes[n].begin(), sizes[n].end());
  90.     cout << mn_flight[n] << " ";
  91.     cout << mx_flight[n] << '\n';
  92.    
  93.     return 0;
  94. }
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement