AhmedAshraff

Untitled

Jul 16th, 2025
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.20 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. #define sz(s) (int)(s).size()
  6. #define all(s) s.begin(),s.end()
  7.  
  8. void Speed() {
  9.     ios_base::sync_with_stdio(false);
  10.     cin.tie(NULL);
  11. }
  12.  
  13. struct MCMF {
  14.     struct edge {
  15.         int to, cap, flow; ll cost;
  16.         int backEdge;
  17.     };
  18.     int n, src, sink;
  19.     vector<vector<edge>> adj;
  20.     vector<ll> pot, dis;
  21.     vector<int> par, from_edge;
  22.     MCMF(int n) : n(n), adj(n + 1), pot(n + 1), dis(n + 1), par(n + 1), from_edge(n + 1) {}
  23.  
  24.     void addEdge(int u, int v, int cap, ll cost) {
  25.         adj[u].push_back({v, cap, 0, cost, sz(adj[v])});
  26.         adj[v].push_back({u, 0, 0, -cost, sz(adj[u]) - 1});
  27.     }
  28.  
  29.     bool dijkstra() {
  30.         fill(dis.begin(), dis.end(), LLONG_MAX);
  31.         fill(par.begin(), par.end(), -1);
  32.         dis[src] = 0;
  33.         priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;
  34.         pq.emplace(0, src);
  35.         while (!pq.empty()) {
  36.             auto [d, u] = pq.top(); pq.pop();
  37.             if (d > dis[u]) continue;
  38.             for (int i = 0; i < sz(adj[u]); ++i) {
  39.                 edge &e = adj[u][i];
  40.                 if (e.flow == e.cap) continue;
  41.                 ll new_cost = e.cost + pot[u] - pot[e.to];
  42.                 if (dis[e.to] > dis[u] + new_cost) {
  43.                     dis[e.to] = dis[u] + new_cost;
  44.                     par[e.to] = u;
  45.                     from_edge[e.to] = i;
  46.                     pq.emplace(dis[e.to], e.to);
  47.                 }
  48.             }
  49.         }
  50.         return dis[sink] != LLONG_MAX;
  51.     }
  52.  
  53.     pair<int, ll> minCostMaxFlow(int _src, int _sink) {
  54.         src = _src; sink = _sink;
  55.         fill(pot.begin(), pot.end(), 0);
  56.         int flow = 0;
  57.         ll cost = 0;
  58.         while (dijkstra()) {
  59.             for (int i = 0; i <= n; ++i)
  60.                 if (dis[i] < LLONG_MAX) pot[i] += dis[i];
  61.             int push = INT_MAX, cur = sink;
  62.             while (cur != src) {
  63.                 int p = par[cur], e = from_edge[cur];
  64.                 push = min(push, adj[p][e].cap - adj[p][e].flow);
  65.                 cur = p;
  66.             }
  67.             cur = sink;
  68.             while (cur != src) {
  69.                 int p = par[cur], e = from_edge[cur];
  70.                 adj[p][e].flow += push;
  71.                 adj[cur][adj[p][e].backEdge].flow -= push;
  72.                 cost += 1LL * push * adj[p][e].cost;
  73.                 cur = p;
  74.             }
  75.             flow += push;
  76.         }
  77.         return {flow, cost};
  78.     }
  79. };
  80.  
  81.  
  82. void solve() {
  83.     int n, m; cin >> n >> m;
  84.     vector<int> a(2 * n + 1);
  85.     for(int i = 1; i <= 2 * n; i++) cin >> a[i];
  86.  
  87.     vector<vector<array<int, 2>>> adj(2 * n + 1);
  88.     for(int i = 0; i < m; i++){
  89.         int u, v, w; cin >> u >> v >> w;
  90.         adj[u].push_back({v, w});
  91.     }
  92.  
  93.     auto dijkstra = [&](int src) -> vector<ll>{
  94.         vector<ll> d(2 * n + 1, 1e17);
  95.         d[src] = 0;
  96.         priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;
  97.         pq.push({0, src});
  98.         while(!pq.empty()){
  99.             auto [c, u] = pq.top(); pq.pop();
  100.             if(c > d[u]) continue;
  101.             for(auto& [v, w] : adj[u]){
  102.                 if(c + w >= d[v]) continue;
  103.                 d[v] = c + w;
  104.                 pq.push({c + w, v});
  105.             }
  106.         }
  107.         return d;
  108.     };
  109.     vector<vector<ll>> dis(2 * n + 1);
  110.     for(int i = 1; i <= 2 * n; i++) dis[i] = dijkstra(i);
  111.  
  112.     int src = 0, sink = 2 * n + 1;
  113.     MCMF mcmf(sink);
  114.     for(int i = 1; i <= 2 * n; i++){
  115.         if(i <= n) mcmf.addEdge(src, i, 1, 0);
  116.         else mcmf.addEdge(i, sink, 1, 0);
  117.     }
  118.     int q; cin >> q;
  119.     while(q--){
  120.         int A, B, C; cin >> A >> C >> B;
  121.         if(A > n || C <= n || dis[A][B] + dis[B][C] != dis[A][C]) continue;
  122.         mcmf.addEdge(A, C, 1, -1LL * a[A] * (2 * n - C + 1));
  123.     }
  124.     auto ans = mcmf.minCostMaxFlow(src, sink);
  125.     if(ans.first != n) return cout << "-1\n", void();
  126.     ll res = -ans.second;
  127.     for(int i = 1; i <= n; i++){
  128.         res += 1LL * (2 * n - i + 1) * a[i];
  129.     }
  130.     cout << res << '\n';
  131. }
  132.  
  133. int main() {
  134.     Speed();
  135.     int tc = 1;
  136.     //cin >> tc;
  137.     while (tc--) {
  138.         solve();
  139.     }
  140.     return 0;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment