mr_dot_convict

GOODA-good-travels-SPOJ-mr.convict

Jun 3rd, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.07 KB | None | 0 0
  1. /*author* Priyanshu Shrivastav (from IIT Palakkad) *
  2.  * *_ __ ___  _ ______ ___  _ ____   ___  ___| |_  *
  3.  * | '_ ` _ \| '__/ __/ _ \| '_ \ \ / / |/ __| __| *
  4.  * | | | | | | | | (_| (_) | | | \ V /| | (__| |_  *
  5.  * |_| |_| |_|_|(_)___\___/|_| |_|\_/ |_|\___|\__| *
  6. When I wrote this, only God and I understood what I was doing
  7.  ** * * * * * * * Now, only God knows * * * * * * */
  8. #include         <bits/stdc++.h>
  9. #pragma GCC      optimize ("Ofast")
  10. #pragma GCC      optimize ("unroll-loops")
  11. #pragma GCC      target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  12.  
  13. #define IOS      ios_base::sync_with_stdio(false); cin.tie (nullptr)
  14. #define PREC     cout.precision (10); cout << fixed
  15. #define x        first
  16. #define y        second
  17. using namespace std;
  18. using pii = pair <int, int>;
  19.  
  20. const int N = (int)1e6 + 10;
  21. vector < vector <pii> > Adj;
  22. int V, E, startv, endv;
  23.  
  24. int vis[N], cn;
  25. vector <int> order;
  26. vector < vector <pii> > AdjT;
  27. vector < set <int> > AdjCC;
  28. int f[N], idx[N];
  29. long long g[N], dp[N];
  30.  
  31. void dfsTimer (int u) {
  32.     vis[u] = 1;
  33.  
  34.     for (auto vPair : Adj[u]) {
  35.         int v = vPair.x;
  36.         if (!vis[v]) dfsTimer (v);
  37.     }
  38.     order.push_back(u);
  39. }
  40.  
  41. void dfsCC(int u) {
  42.     vis[u] = 1;
  43.     idx[u] = cn;
  44.     g[cn] += 1ll*f[u];
  45.  
  46.     for (auto vPair : AdjT[u]) {
  47.         int v = vPair.x;
  48.         if (!vis[v]) dfsCC(v);
  49.     }
  50. }
  51.  
  52. void ccomp_dir() {
  53.     cn = 0;
  54.     AdjT.assign(V, vector <pii> ());
  55.     order.clear();
  56.     fill (vis, vis + N, 0);
  57.     fill (idx, idx + N, -1);
  58.  
  59.     for (int u = 0; u < V; ++u)
  60.         if (!vis[u]) dfsTimer(u);
  61.  
  62.     for (int u = 0; u < V; ++u) {
  63.         for (auto vPair : Adj[u]) {
  64.             int v = vPair.x;
  65.             long long w = vPair.y;
  66.             AdjT[v].push_back(pii(u, w));
  67.         }
  68.     }
  69.  
  70.     fill (vis, vis + N, 0);
  71.     reverse (order.begin(), order.end());
  72.  
  73.     for (auto u : order) {
  74.         if (!vis[u]) {
  75.             dfsCC (u);
  76.             ++cn;
  77.         }
  78.     }
  79. }
  80.  
  81. void read() {
  82.     int n, m, u, v, w = 1;
  83.     cin >> n >> m >> startv >> endv;
  84.     --startv, --endv;
  85.     V = n, E = m;
  86.     Adj.assign(V, vector <pii>());
  87.     for (int i = 0; i < n; ++i) cin >> f[i];
  88.  
  89.     for (int e = 0; e < m; ++e) {
  90.         cin >> u >> v;
  91.         --u, --v;
  92.         Adj[u].emplace_back(pii(v, w));
  93.     }
  94. }
  95.  
  96. vector <int> cc_order;
  97. void dfs_order(int u) {
  98.    vis[u] = true;
  99.    for (int v : AdjCC[u]) if (!vis[v]) dfs_order(v);
  100.    cc_order.push_back(u);
  101. }
  102.  
  103. void solve() {
  104.     for (int i = 0; i < N; ++i) { // for each connected component
  105.         g[i] = dp[i] = 0;
  106.     }
  107.     ccomp_dir();
  108.  
  109.     AdjCC.assign(cn, set <int>());
  110.     for (int u = 0; u < V; ++u) {
  111.         for (auto vPair : Adj[u]) {
  112.             int v = vPair.x;
  113.             if (idx[u] == idx[v]) continue;
  114.             AdjCC[idx[u]].insert(idx[v]); // condensed graph's adj
  115.         }
  116.     }
  117.  
  118.     int src = idx[startv], tar = idx[endv];
  119.  
  120.     for (int i = 0; i < cn; ++i)
  121.       dp[i] = -1, vis[i] = false;
  122.  
  123.    for (int i = 0; i < cn; ++i) if (!vis[i]) dfs_order(i);
  124.    reverse(cc_order.begin(), cc_order.end());
  125.    dp[src] = g[src];
  126.  
  127.    for (int u : cc_order) {
  128.       for (int v : AdjCC[u]) {
  129.          if (dp[u] != -1) dp[v] = max(dp[v], dp[u] + g[v]);
  130.       }
  131.    }
  132.  
  133.     cout << dp[tar] << '\n';
  134. }
  135.  
  136. signed main() {
  137.     IOS; PREC;
  138.     read();
  139.     solve();
  140.  
  141.     return EXIT_SUCCESS;
  142. }
Add Comment
Please, Sign In to add comment