Advertisement
akashtadwai

Number of shortest paths

Aug 24th, 2021
1,259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.32 KB | None | 0 0
  1. #define ll long long
  2. #define ar array<ll,2>
  3. class Solution {
  4. public:
  5.     const int mod = 1e9+7;
  6.     void add_self(int &a, int b){
  7.         a+=b;
  8.         if(a>=mod) a-=mod;
  9.     }
  10.     int dijkstra( vector<vector<pair<int,int>>>&g,int n){
  11.         priority_queue<ar, vector<ar>, greater<ar>> pq;
  12.         pq.push({0LL,0LL});
  13.         const int inf = 1e16+5;
  14.         vector<ll>dis(n,inf);
  15.         vector<int>num(n,0);
  16.         dis[0]=0;
  17.         num[0]=1LL;
  18.         while(!pq.empty()){
  19.             auto [dist,node] = pq.top();
  20.             pq.pop();
  21.             if(dis[node]!=dist) continue;
  22.             for(auto [d,to]: g[node]){
  23.                 if(dis[node]+d<dis[to]){
  24.                     dis[to] = (dis[node]+d);
  25.                     num[to] = (num[node]%mod);
  26.                     pq.push({dis[to],to});
  27.                 }
  28.                 else if(dis[node]+d==dis[to]){
  29.                     add_self(num[to],num[node]);
  30.                 }
  31.             }
  32.         }
  33.         return num[n-1];
  34.     }
  35.     int countPaths(int n, vector<vector<int>>& roads) {
  36.         vector<vector<pair<int,int>>>g(n);
  37.         for(int i=0;i<(int)roads.size();i++){
  38.             int u=roads[i][0],v=roads[i][1],w=roads[i][2];
  39.             g[u].push_back({w,v});
  40.             g[v].push_back({w,u});
  41.         }
  42.         return dijkstra(g,n);
  43.     }
  44. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement