Guest User

Untitled

a guest
Oct 3rd, 2016
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <iosfwd>
  3. #include <iomanip>
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <ctime>
  8. #include <cmath>
  9. #include <cassert>
  10. #include <cctype>
  11. #include <climits>
  12. #include <vector>
  13. #include <bitset>
  14. #include <set>
  15. #include <queue>
  16. #include <stack>
  17. #include <map>
  18. #include <deque>
  19. #include <string>
  20. #include <list>
  21. #include <iterator>
  22. #include <sstream>
  23. #include <complex>
  24. #include <fstream>
  25. #include <functional>
  26. #include <numeric>
  27. #include <utility>
  28. #include <algorithm>
  29. #include <assert.h>
  30. #include <unordered_map>
  31. using namespace std;
  32.  
  33. typedef long long ll;
  34. typedef unsigned long long ull;
  35. typedef double ld;
  36. typedef vector < long long > vll;
  37. typedef pair <long long, long long> pll;
  38. typedef pair <int, int> pii;
  39. typedef vector < int > vii;
  40. typedef complex < double > Point;
  41.  
  42. #define csl ios_base::sync_with_stdio(false); cin.tie(NULL)
  43. #define mp make_pair
  44. #define fst first
  45. #define snd second
  46.  
  47. ll t, n, m, u, v, q, r, ql, qr, k, l, s, w, z, x, y, d, p, c, L, b;
  48. const int N = 21;
  49. const int LN = 21;
  50. const long long mod = 1e9 + 7;
  51. const long long INF = 1LL << 52LL;
  52.  
  53. ll dp[1 << N][N][2];
  54. vii adj[N][2];
  55. vector <ll> cst[N][2];
  56.  
  57. int main() {
  58.     csl;
  59.     cin >> n >> m;
  60.    
  61.     for (int i = 1; i <= m; ++i) {
  62.         char type;
  63.         cin >> u >> v >> c >> type;
  64.         u--, v--;
  65.         if (type == 'B') {
  66.             adj[u][0].push_back(v);
  67.             adj[v][0].push_back(u);
  68.             cst[u][0].push_back(c);
  69.             cst[v][0].push_back(c);
  70.         } else {
  71.             adj[u][1].push_back(v);
  72.             adj[v][1].push_back(u);
  73.             cst[u][1].push_back(c);
  74.             cst[v][1].push_back(c);
  75.         }
  76.     }
  77.    
  78.     for (int i = 0; i < (1 << n); ++i)
  79.         for (int j = 0; j < n; ++j)
  80.             dp[i][j][1] = dp[i][j][0] = INF;
  81.     for (int i = 0; i < n; ++i) {
  82.         dp[1 << i][i][0] = dp[1 << i][i][1] = 0;
  83.     }
  84.    
  85.     for (int i = 1; i < (1 << n); ++i) {
  86.         for (int j = 0; j < n; ++j) {
  87.             for (int k = 0; k < 2; ++k) {
  88.                 if (dp[i][j][k] == INF) continue;
  89.                 for (int l = 0; l < adj[j][1 - k].size(); ++l) {
  90.                     int u = adj[j][1 - k][l];
  91.                     if (i & (1 << u)) continue;
  92.                     dp[i | (1 << u)][u][1 - k] = min(dp[i | (1 << u)][u][1 - k], dp[i][j][k] + cst[j][1 - k][l]);
  93.                 }
  94.             }
  95.         }
  96.     }
  97.     ll sol = INF;
  98.     for (int i = 0; i < n; ++i) {
  99.         for (int j = 0; j < 2; ++j) {
  100.             sol = min(sol, dp[(1 << n) - 1][i][j]);
  101.         }
  102.     }
  103.     if (sol == INF) sol = -1;
  104.     cout << sol << '\n';
  105.     return 0;
  106. }
Add Comment
Please, Sign In to add comment