mr_dot_convict

JHNSN-Johnson's-Algorithm-SPOJ-mr.convict

May 17th, 2019
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1.  
  2.  
  3. /*author* Priyanshu Shrivastav (from IIT Palakkad) *
  4.  * *_ __ ___  _ ______ ___  _ ____   ___  ___| |_  *
  5.  * | '_ ` _ \| '__/ __/ _ \| '_ \ \ / / |/ __| __| *
  6.  * | | | | | | | | (_| (_) | | | \ V /| | (__| |_  *
  7.  * |_| |_| |_|_|(_)___\___/|_| |_|\_/ |_|\___|\__| *
  8. When I wrote this, only God and I understood what I was doing
  9.  ** * * * * * * * Now, only God knows * * * * * * */
  10. #include         <bits/stdc++.h>
  11. #pragma GCC      optimize ("Ofast")
  12. #pragma GCC      optimize ("unroll-loops")
  13. #pragma GCC      target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  14.  
  15. #define IOS      ios_base::sync_with_stdio(false); cin.tie (nullptr)
  16. #define PREC     cout.precision (10); cout << fixed
  17. #define bg(x)    "[ " << #x << " : " << x << " ]"
  18. #define x        first
  19. #define y        second
  20. using namespace std;
  21. using pii = pair <int, int>;
  22.  
  23. const int N = 105;
  24. const int infi = (int)1e9;
  25.  
  26. struct Edge {
  27.    int u, v, w;
  28. };
  29. vector <Edge> edges;
  30. vector < vector <pii> > Adj;
  31.  
  32. int h[N], d[N][N];
  33. int n, m;
  34.  
  35. bool bellmanFord() {
  36.    for (int i = 0; i < n + 1; ++i) {
  37.       for (Edge e : edges) {
  38.          if (h[e.u] < infi && h[e.v] > h[e.u] + e.w) {
  39.             h[e.v] = h[e.u] + e.w;
  40.             if (i == n) return false;
  41.          }
  42.       }
  43.    }
  44.    return true;
  45. }
  46.  
  47. void dijkstra(int s, int dist[]) {
  48.    bool vis[N] = {0};
  49.    priority_queue <pii, vector <pii>, greater <pii> > Q;
  50.    fill (dist, dist + n, infi);
  51.    dist[s] = 0;
  52.    Q.push(pii(dist[s], s));
  53.  
  54.    while (!Q.empty()) {
  55.       pii tmp = Q.top();
  56.       Q.pop();
  57.       int u = tmp.y;
  58.       if (vis[u]) continue;
  59.  
  60.       for (auto vPair : Adj[u]) {
  61.          int v = vPair.x, w = vPair.y;
  62.          if (!vis[v] && dist[u] < infi && dist[v] > dist[u] + w) {
  63.             dist[v] = dist[u] + w;
  64.             Q.push(pii(dist[v], v));
  65.          }
  66.       }
  67.    }
  68. }
  69.  
  70. void solve(int tc) {
  71.    //finding h
  72.    for (int i = 0; i < n; ++i) {
  73.       edges.push_back({n, i, 0});
  74.    }
  75.    h[n] = 0;
  76.    fill (h, h + n, infi);
  77.    bool ok = bellmanFord();
  78.    if (!ok) {
  79.       cout << "graph " << tc << " no\n";
  80.    }
  81.    else {
  82.       cout << "graph " << tc << " yes\n\n";
  83.       for (int i = 0; i < n + 1; ++i)
  84.          cout << h[i] << " \n"[i == n];
  85.       cout << '\n';
  86.  
  87.       for (Edge e : edges) {
  88.          if (e.u == n) continue;
  89.          Adj[e.u].push_back(pii(e.v, e.w - h[e.u] + h[e.v]));
  90.       }
  91.  
  92.       for (int i = 0; i < n; ++i)
  93.          dijkstra(i, d[i]);
  94.  
  95.       for (int i = 0; i < n; ++i) {
  96.          for (int j = 0; j < n; ++j) {
  97.             if (d[i][j] == infi) continue;
  98.             d[i][j] += h[i] - h[j];
  99.          }
  100.       }
  101.       for (int i = 0; i < n; ++i) {
  102.          for (int j = 0; j < n; ++j) {
  103.             if (d[i][j] == infi) cout << "# ";
  104.             else cout << d[i][j] << ' ';
  105.          }
  106.          cout << '\n';
  107.       }
  108.    }
  109.    cout << '\n';
  110. }
  111.  
  112. void read() {
  113.    cin >> n >> m;
  114.    edges.clear();
  115.    Adj.assign(n, vector <pii> ());
  116.  
  117.    int u, v, w;
  118.    for (int i = 0; i < m; ++i) {
  119.       cin >> u >> v >> w;
  120.       --u, --v;
  121.       edges.push_back({u, v, w});
  122.    }
  123. }
  124.  
  125. signed main() {
  126.    int tc;
  127.    cin >> tc;
  128.    for (int i = 1; i <= tc; ++i) {
  129.       read();
  130.       solve(i);
  131.    }
  132.  
  133.    return EXIT_SUCCESS;
  134. }
Add Comment
Please, Sign In to add comment