Advertisement
ThegeekKnight16

Mansão do Mamão

Nov 26th, 2024
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int INF = 2e18 + 10;
  5. vector<vector<int>> grafo;
  6. vector<array<int, 3>> dp;
  7. vector<int> val, marc;
  8. vector<int> pai, sub;
  9.  
  10.  
  11. int find(int v) {return pai[v] = (pai[v] == v ? v : find(pai[v]));}
  12. bool une(int x, int y)
  13. {
  14.     x = find(x); y = find(y);
  15.     if (x == y) return 0;
  16.     if (sub[x] < sub[y]) swap(x, y);
  17.     pai[y] = x; sub[x] += sub[y];
  18.     return 1;
  19. }
  20.  
  21.  
  22. void dfs(int v, int p)
  23. {
  24.     dp[v] = {0, val[v], 0};
  25.  
  26.     int minMuda = INF;
  27.     for (auto viz : grafo[v])
  28.     {
  29.         if (viz == p) continue;
  30.         dfs(viz, v);
  31.         dp[v][1] += min(dp[viz][1], dp[viz][2]);
  32.         dp[v][2] += min(dp[viz][0], dp[viz][1]);
  33.         minMuda = min(minMuda, dp[viz][1] - min(dp[viz][0], dp[viz][1]));
  34.     }
  35.  
  36.     dp[v][0] = dp[v][2] + (marc[v] ? 0 : minMuda);
  37. }
  38.  
  39. int bt(int id, const vector<pair<int, int>> &edges)
  40. {
  41.     if (id == edges.size())
  42.     {
  43.         dfs(1, 1);
  44.         return min(dp[1][0], dp[1][1]);
  45.     }
  46.  
  47.     auto [X, Y] = edges[id];
  48.     int auxX = val[X], auxY = val[Y];
  49.     int resp = INF;
  50.     resp = min(resp, bt(id+1, edges));
  51.     val[X] = 0; marc[Y]++;
  52.     resp = min(resp, bt(id+1, edges)+auxX);
  53.     val[X] = auxX; marc[Y]--;
  54.     val[Y] = 0; marc[X]++;
  55.     resp = min(resp, bt(id+1, edges)+auxY);
  56.     val[Y] = auxY; marc[X]--;
  57.  
  58.     return resp;
  59. }
  60.  
  61. void solve()
  62. {
  63.     int N, M;
  64.     cin >> N >> M;
  65.     pai.resize(N+1); iota(pai.begin(), pai.end(), 0);
  66.     sub.resize(N+1); fill(sub.begin(), sub.end(), 1);
  67.  
  68.     val.resize(N+1);
  69.     for (int i = 1; i <= N; i++) cin >> val[i];
  70.     grafo.clear(); grafo.resize(N+1); dp.resize(N+1); marc.clear(); marc.resize(N+1);
  71.     vector<pair<int, int>> edges;
  72.     for (int i = 1; i <= M; i++)
  73.     {
  74.         int X, Y;
  75.         cin >> X >> Y;
  76.         if (une(X, Y))
  77.             grafo[X].push_back(Y), grafo[Y].push_back(X);
  78.         else
  79.             edges.emplace_back(X, Y);
  80.     }
  81.  
  82.     cout << bt(0, edges) << '\n';
  83. }
  84.  
  85. int32_t main()
  86. {
  87.     ios_base::sync_with_stdio(false);
  88.     cin.tie(NULL);
  89.     int T; cin >> T;
  90.     while (T--) solve();
  91. }
  92.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement