mr_dot_convict

INGRED-SPOJ-mr.convict

May 15th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.14 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. #define x        first
  10. #define y        second
  11. using namespace std;
  12.  
  13. const int N = 105;
  14. const int infi = (int)1e9;
  15. const long long inf = (long long)1e18;
  16.  
  17. int n, m, s, k1, k2;
  18. int W[N][N];
  19. vector <int> S;
  20.  
  21. void floydWarshall() {
  22.    for (int k = 0; k < n; ++k)
  23.       for (int i = 0; i < n; ++i)
  24.          for (int j = 0; j < n; ++j)
  25.             if (W[i][k] < infi && W[k][j] < infi)
  26.                W[i][j] = W[j][i] = min(W[i][j], W[i][k] + W[k][j]);
  27. }
  28.  
  29. inline int fac(int num) { return (num == 0 ? 1 : fac(num - 1) * num); }
  30.  
  31. void solve() {
  32.    floydWarshall();
  33.  
  34.    int totalPerm = fac(s);
  35.    long long mnDist = inf;
  36.  
  37.    for (int it = 0; it < totalPerm; ++it) {
  38.       if (it) next_permutation(S.begin(), S.end());
  39.  
  40.       long long dk1[9], dk2[9];
  41.       dk2[s] = dk1[0] = 0;
  42.  
  43.  
  44.       for (int i = 1; i <= s; ++i) {
  45.          if (i == 1) dk1[i] = W[k1][S[i - 1]];
  46.          else dk1[i] = dk1[i - 1] + 1ll * W[S[i - 2]][S[i - 1]];
  47.       }
  48.  
  49.       for (int i = s - 1; i >= 0; --i) {
  50.          if (i == s - 1) dk2[i] = W[k2][S[i]];
  51.          else dk2[i] = dk2[i + 1] + 1ll * W[S[i + 1]][S[i]];
  52.       }
  53.  
  54.       for (int i = 0; i <= s; ++i) {
  55.          mnDist = min(mnDist, dk1[i] + dk2[i]);
  56.       }
  57.    }
  58.    cout << mnDist << '\n';
  59. }
  60.  
  61. void read() {
  62.    cin >> m;
  63.    int u, v, c;
  64.    for (int i = 0; i < n; ++i)
  65.       for (int j = 0; j < n; ++j)
  66.          W[i][j] = (i == j ? 0 : infi);
  67.  
  68.    for (int i = 0; i < m; ++i) {
  69.       cin >> u >> v >> c;
  70.       W[u][v] = W[v][u] = c;
  71.    }
  72.  
  73.    cin >> s;
  74.    S.clear();
  75.    for (int i = 0; i < s; ++i) {
  76.       cin >> u;
  77.       S.push_back(u);
  78.    }
  79.  
  80.    cin >> k1 >> k2;
  81. }
  82.  
  83. signed main() {
  84.    while (cin >> n) {
  85.       read();
  86.       solve();
  87.    }
  88.  
  89.    return EXIT_SUCCESS;
  90. }
Add Comment
Please, Sign In to add comment