bingxuan9112

1779

Apr 16th, 2020
452
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.51 KB | None | 0 0
  1. //   __________________
  2. //  | ________________ |
  3. //  ||          ____  ||
  4. //  ||   /\    |      ||
  5. //  ||  /__\   |      ||
  6. //  || /    \  |____  ||
  7. //  ||________________||
  8. //  |__________________|
  9. //  \###################\
  10. //   \###################\
  11. //    \        ____       \
  12. //     \_______\___\_______\
  13. // An AC a day keeps the doctor away.
  14.  
  15. #pragma g++ optimize("Ofast")
  16. #pragma loop_opt(on)
  17. #include <bits/extc++.h>
  18. #ifdef local
  19. #define debug(x) (cerr<<#x<<" = "<<(x)<<'\n')
  20. #else
  21. #include <bits/stdc++.h>
  22. #define debug(x) ((void)0)
  23. #endif // local
  24. #define all(v) begin(v),end(v)
  25. #define siz(v) (ll(v.size()))
  26. #define get_pos(v,x) (lower_bound(all(v),x)-begin(v))
  27. #define sort_uni(v) sort(begin(v),end(v)),v.erase(unique(begin(v),end(v)),end(v))
  28. #define pb emplace_back
  29. #define ff first
  30. #define ss second
  31. #define mem(v,x) memset((v),(x),sizeof(v))
  32.  
  33. using namespace std;
  34. using namespace __gnu_pbds;
  35. typedef int64_t ll;
  36. typedef long double ld;
  37. typedef pair<ll,ll> pll;
  38. typedef pair<ld,ld> pld;
  39. template <typename T> using max_heap = std::priority_queue<T,vector<T>,less<T> >;
  40. template <typename T> using min_heap = std::priority_queue<T,vector<T>,greater<T> >;
  41. template <typename T> using rbt = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
  42. constexpr ld PI = acos(-1), eps = 1e-7;
  43. constexpr ll N = 120025, INF = 1e18, MOD = 998244353, K = 20, inf = 1e9;
  44. constexpr inline ll cdiv(ll x, ll m) { return x/m + ((x<0 ^ m>0) && (x%m)); } // ceiling divide
  45. constexpr inline ll modpow(ll e,ll p,ll m=MOD) {ll r=1; for(e%=m;p;p>>=1,e=e*e%m) if(p&1) r=r*e%m; return r;}
  46.  
  47. struct Dinic {
  48.     struct Edge {
  49.         int rest, to;
  50.     } E[N];
  51.     vector<int> G[N];
  52.     int n, tot, dis[N], cur[N];
  53.     void init(int _n) {
  54.         n = _n;
  55.         for(int i = 0; i < n; i++) G[i].clear();
  56.         tot = 0;
  57.     }
  58.     void addEdge(int a, int b, int cap) {
  59.         E[tot] = {cap, b}, G[a].pb(tot++);
  60.         E[tot] = {0, a}, G[b].pb(tot++);
  61.     }
  62.     bool BFS(int s, int t) {
  63.         for(int i = 0; i < n; i++) dis[i] = -1;
  64.         queue<int> q;
  65.         dis[s] = 0;
  66.         q.push(s);
  67.         while(!q.empty()) {
  68.             int i = q.front(); q.pop();
  69.             for(int id: G[i]) if(E[id].rest && dis[E[id].to] == -1) {
  70.                 dis[E[id].to] = dis[i] + 1;
  71.                 q.push(E[id].to);
  72.             }
  73.         }
  74.         return dis[t] != -1;
  75.     }
  76.     int DFS(int i, int t, int lim) {
  77.         if(i == t) return lim;
  78.         int ans = 0;
  79.         while(cur[i] < G[i].size() && lim) {
  80.             int id = G[i][cur[i]++];
  81.             if(dis[E[id].to] != dis[i]+1) continue;
  82.             int f = DFS(E[id].to, t, min(lim, E[id].rest));
  83.             E[id].rest -= f;
  84.             E[id^1].rest += f;
  85.             ans += f;
  86.             lim -= f;
  87.         }
  88.         return ans;
  89.     }
  90.     int maxFlow(int s, int t) {
  91.         int ans = 0;
  92.         while(BFS(s,t)) {
  93.             for(int i = 0; i < n; i++) cur[i] = 0;
  94.             while(int f = DFS(s,t,inf)) ans += f;
  95.         }
  96.         return ans;
  97.     }
  98. } flow;
  99. signed main() {
  100.     ios_base::sync_with_stdio(0), cin.tie(0);
  101.     int n, m;
  102.     cin >> n >> m;
  103.     flow.init(n+2);
  104.     int sum = 0;
  105.     for(int i = 1, v; i <= n; i++) {
  106.         cin >> v;
  107.         if(v >= 0)
  108.             flow.addEdge(0, i, v), sum += v;
  109.         else
  110.             flow.addEdge(i, n+1, -v);
  111.     }
  112.     while(m--) {
  113.         int a, b;
  114.         cin >> a >> b;
  115.         flow.addEdge(b, a, inf);
  116.     }
  117.     cout << sum - flow.maxFlow(0, n+1) << '\n';
  118. }
Advertisement
Add Comment
Please, Sign In to add comment