Dsxv

Investigation cses

Jun 30th, 2020
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std ;
  3.  
  4. #define int long long
  5. const int INF = 1e18 ;
  6. const int mod = 1e9 + 7 ;
  7.  
  8. pair<vector<int>,vector<int>> dijkstra(vector<vector<pair<int,int>>>& g , int start , int n){
  9.     vector<int> d(n,INF) ;
  10.     vector<int> p(n,-1) ;
  11.     using pii = pair<int,int> ;
  12.     d[start] = 0 ;
  13.     p[start] = start ;
  14.     priority_queue<pii , vector<pii> , greater<pii>> pq ;
  15.     pq.push({0,start}) ;
  16.     while(pq.size()){
  17.         auto [val,cur] = pq.top() ;
  18.         pq.pop() ;
  19.         if(d[cur] != val) continue ; // koi aur accha change kargya hai isse
  20.  
  21.         for(auto [to,dis] : g[cur]){
  22.             if(d[to] > d[cur] + dis) {
  23.                 pq.push({d[cur] + dis , to}) ;
  24.                 d[to] = d[cur] + dis ;
  25.                 p[to] = cur ;
  26.             }
  27.         }
  28.     }
  29.     return {d,p} ;
  30. }
  31.  
  32. int32_t main(){
  33.     ios :: sync_with_stdio(0) ;
  34.     cin.tie(0) ;
  35.     int n , m ;
  36.     cin >> n >> m ;
  37.     vector<vector<pair<int,int>>> gg , gcomp , g;
  38.     g.resize(n) ; gg.resize(n) ; gcomp.resize(n) ;
  39.     for(int i = 0 ; i < m ; i++){
  40.         int f , s , c ;
  41.         cin >> f >> s >> c ;
  42.         f-- , s-- ;
  43.         gg[f].push_back({s,c}) ;
  44.         gcomp[s].push_back({f,c}) ;
  45.     }
  46.     int start = 0 ;
  47.     auto [dp1,p1] = dijkstra(gg,start,n) ; // 0 is source vertex
  48.     // ans is all path from source , parent is for retracing path from any vertex to source
  49.     auto [dp2,p2] = dijkstra(gcomp , n-1,n) ;
  50.     for(int i = 0 ; i < n ; i++){
  51.         for(auto j : gg[i]){
  52.             if(dp1[i] + j.second + dp2[j.first] == (dp1[n-1])){
  53.                 g[i].push_back({j.first,1}) ;
  54.             }
  55.         }
  56.     }
  57.     cout << dp1.back() << " " ;
  58.     vector<int> dp(n,-1)  ;
  59.     dp[n-1] = 1 ;
  60.     function<int(int)> dfs = [&](int start) -> int {
  61.         if(start == n-1){
  62.             return 1 ;
  63.         }
  64.         if(~dp[start]) return dp[start] ;
  65.         int cnt = 0 ;
  66.         for(auto i : g[start]) {
  67.             cnt = (cnt + dfs(i.first)) % mod ;
  68.         }
  69.         return dp[start] = cnt ;
  70.     } ;
  71.     int ans1 = dfs(0) ;
  72.     cout << ans1 << " "  ;
  73.     auto [dp3 , p3] = dijkstra(g,0,n) ;
  74.     cout << dp3.back() <<  " "  ;
  75.     for(int i = 0 ; i < n ; i++){
  76.         for(auto &j : g[i]) j.second *= -1 ;
  77.     }
  78.     auto [dp4 , p4] = dijkstra(g,0,n) ;
  79.     cout << dp4.back()*-1 ;
  80.     return 0 ;
  81. }
Add Comment
Please, Sign In to add comment