Dsxv

cses_high_score

Jun 25th, 2020
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.49 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std ;
  3.  
  4. #define int long long
  5.  
  6.  
  7. struct DSU{
  8.     vector<int> parent , val ;
  9.     int N ;
  10.     DSU(){
  11.         N = 10 ;
  12.     }
  13.     DSU(int n){
  14.         N = n ;
  15.         parent.resize(n) ;
  16.         val.resize(n) ;
  17.         for(int i = 0 ; i < N ; i++) {
  18.             parent[i] = i ;
  19.             val[i] = 1 ;
  20.         }
  21.     }
  22.     int gp(int v){ //get_parent
  23.         if(v == parent[v])
  24.             return v ;
  25.         return parent[v] = gp(parent[v]) ;
  26.     }
  27.     bool merge(int a , int b){
  28.         a = gp(a) , b = gp(b) ;
  29.         if(a == b) return true ;
  30.         if(val[a] < val[b]) // a must remain the greatest!!! :p
  31.             swap(a,b) ;
  32.         parent[b] = parent[a] ;
  33.         val[a] += val[b] ;
  34.         return false ;
  35.     }
  36. } dsu(3000) ;
  37.  
  38. const int INF = 1e15 ;
  39. struct edge{
  40.     int a , b , c ;
  41. } ;
  42. vector<edge> g ;
  43. vector<vector<int>> gg , ggcomp;
  44.  
  45. void dfs(int start , vector<int>& v , int* visited){
  46.     if(visited[start]) return ;
  47.     visited[start] = 1 ;
  48.     for(auto i : gg[start]){
  49.         dfs(i,v,visited) ;
  50.     }
  51.     v.push_back(start) ;
  52. }
  53.  
  54. void dfs2(int start , vector<int>& v , int* visited){
  55.     if(visited[start]) return ;
  56.     visited[start] = 1 ;
  57.     for(auto i : ggcomp[start]){
  58.         dfs2(i,v,visited) ;
  59.     }
  60.     v.push_back(start) ;
  61. }
  62.  
  63. pair<vector<int>,vector<int>> solve(int start , int n){
  64.     vector<int> d(n,INF) ;
  65.     vector<int> p(n,-1) ;
  66.     p[start] = start ;
  67.     d[start] = 0 ;
  68.     int x ;
  69.     for(int i = 0 ; i < n ; i++){
  70.         x = -1 ;
  71.         for(auto j : g){
  72.             if(d[j.a] < INF && (dsu.gp(n-1) == dsu.gp(j.a)) ) {
  73.                 if(d[j.b] > d[j.a] + j.c){
  74.                     d[j.b] = max(-INF , d[j.a] + j.c) ;
  75.                     p[j.b] = j.a ;
  76.                     x = j.b ;
  77.                 }
  78.             }
  79.         }
  80.     }
  81.     // x != -1 means last run me bhi kuch update hua hai , gadbad
  82.     if(~x){
  83.         cout << -1 ;
  84.         exit(0) ;
  85.     } else {
  86.         return {d,p} ;
  87.     }
  88. }
  89.  
  90. int32_t main(){
  91.     int n , m  ;
  92.     cin >> n >> m ;
  93.     g.resize(m) ;
  94.     gg.resize(n) ;
  95.     ggcomp.resize(n) ;
  96.  
  97.     for(int i = 0 ; i < m ; i++){
  98.         cin >> g[i].a >> g[i].b >> g[i].c ;
  99.         g[i].a-- , g[i].b-- ;
  100.         gg[g[i].a].push_back(g[i].b) ;
  101.         ggcomp[g[i].b].push_back(g[i].a) ;
  102.         g[i].c *= -1 ;
  103.     }
  104.     gg[n-1].push_back(0) ;
  105.     ggcomp[0].push_back(n-1) ;
  106.     vector<int> v;
  107.     int visited[n] = {} ;
  108.     for(int i = 0 ; i < n ; i++){
  109.         if(!visited[i]) dfs(i,v,visited) ;
  110.     }
  111.     for(int i = 0 ; i < n ; i++) visited[i] = 0 ;
  112.     vector<vector<int>> comp ;
  113.     while(v.size()){
  114.         if(!visited[v.back()]){
  115.             vector<int> temp ;
  116.             dfs2(v.back() , temp , visited) ;
  117.             comp.push_back(temp) ;
  118.         }
  119.         v.pop_back() ;
  120.     }
  121.     for(auto i : comp){
  122.         for(auto j : i) dsu.merge(i.back() , j) ;
  123.     }
  124.     auto [d,p] = solve(0,n) ;
  125.     cout << d.back()*-1 ;
  126.     return 0 ;
  127. }
Add Comment
Please, Sign In to add comment