Advertisement
double_trouble

dinic

Feb 11th, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.23 KB | None | 0 0
  1. #pragma comment(linker, "/STACK:256000000")
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<iostream>
  8. #include<fstream>
  9. #include<vector>
  10. #include<string>
  11. #include<map>
  12. #include<set>
  13. #include<queue>
  14. #include<deque>
  15. #include<bitset>
  16. #include<sstream>
  17. #include<unordered_set>
  18. #include<unordered_map>
  19.  
  20. using namespace std;
  21.  
  22. typedef unsigned long long ull;
  23. typedef long long ll;
  24. typedef pair<ll, ll> pii;
  25. typedef pair<ll, pii> piii;
  26. #define xx first
  27. #define yy second.first
  28. #define zz second.second
  29. #define mp make_pair
  30.  
  31. const ll MOD = (ll)1e10 + 7;
  32. const int dx[] = { 0, 1, 0, -1 };
  33. const int dy[] = { 1, 0, -1, 0 };
  34. const int MAXN = (int)1e6 + 5;
  35. const int MAXH = 21;
  36.  
  37. struct edge
  38. {
  39.   int v, to;
  40.   ll cap, fl;
  41.   edge() {};
  42.   edge(int v, int to, ll cap) : v(v), to(to), cap(cap), fl(0) {};
  43. };
  44.  
  45. vector<edge> e(0);
  46. vector<int> g[MAXN];
  47. int used[MAXN];
  48. ll d[MAXN];
  49. ll s, t, n, m;
  50. ll k;
  51.  
  52.  
  53. bool bfs()
  54. {
  55.   queue<int> q;
  56.   q.push(s);
  57.   for (int i = 0; i < 2 * n + 2; i++)
  58.     d[i] = MOD;
  59.   d[s] = 0;
  60.   while (!q.empty())
  61.   {
  62.     int v = q.front();
  63.     q.pop();
  64.     for (int i = 0; i < g[v].size(); i++)
  65.     {
  66.       int ei = g[v][i];
  67.       int to = e[ei].to;
  68.       ll cap = e[ei].cap - e[ei].fl;
  69.       if (d[to] > d[v] + 1 && cap > 0)
  70.       {
  71.         d[to] = d[v] + 1;
  72.         q.push(to);
  73.       }
  74.     }
  75.   }
  76.   return (d[t] < MOD);
  77. }
  78.  
  79. ll dfs(int v, ll flow)
  80. {
  81.   if (v == t)
  82.     return flow;
  83.   for (; used[v] < g[v].size(); used[v]++)
  84.   {
  85.     int ei = g[v][used[v]], to = e[ei].to;
  86.     ll cap = e[ei].cap - e[ei].fl;
  87.     if (cap > 0 && d[to] == d[v] + 1)
  88.     {
  89.       ll mfl = min(cap, flow);
  90.       mfl = dfs(to, mfl);
  91.       if (mfl > 0)
  92.       {
  93.         e[ei].fl += mfl;
  94.         e[ei ^ 1].fl -= mfl;
  95.         return mfl;
  96.       }
  97.     }
  98.   }
  99.   return 0ll;
  100. }
  101.  
  102. ll cnt[MAXN];
  103.  
  104. int main()
  105. {
  106.   ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  107. #ifdef _DEBUG
  108.   freopen("input.txt", "r", stdin);
  109.   freopen("output.txt", "w", stdout);
  110. #endif
  111.   cin >> k >> n >> m >> s >> t;
  112.   s--, t--;
  113.   if (s == t)
  114.   {
  115.     cout << "NO";
  116.     return 0;
  117.   }
  118.   for (int i = 0; i < n; i++)
  119.     cin >> cnt[i];
  120.   for (int i = 0; i < m; i++)
  121.   {
  122.     int v, to;
  123.     cin >> v >> to;
  124.     v--, to--;
  125.     if (to != s || v != t)
  126.     {
  127.       g[2 * v + 1].push_back(e.size());
  128.       e.push_back(edge(2 * v + 1, 2 * to, MOD));
  129.       g[2 * to].push_back(e.size());
  130.       e.push_back(edge(2 * to, 2 * v + 1, 0));
  131.     }
  132.     if (to != t || v != s)
  133.     {
  134.       g[2 * to + 1].push_back(e.size());
  135.       e.push_back(edge(2 * to + 1, 2 * v, MOD));
  136.       g[2 * v].push_back(e.size());
  137.       e.push_back(edge(2 * v, 2 * to + 1, 0));
  138.     }
  139.   }
  140.   for (int i = 0; i < n; i++)
  141.   {
  142.     if (i == s || i == t)
  143.       continue;
  144.     g[2 * i].push_back(e.size());
  145.     e.push_back(edge(2 * i, 2 * i + 1, cnt[i]));
  146.     g[2 * i + 1].push_back(e.size());
  147.     e.push_back(edge(2 * i + 1, 2 * i, 0));
  148.   }
  149.   s = s * 2 + 1;
  150.   t = t * 2;
  151.  
  152.   ll ans = 0;
  153.   while (bfs())
  154.   {
  155.     for (int i = 0; i < 2 * n; i++)
  156.       used[i] = 0;
  157.     ll fl = 0;
  158.     while (fl = dfs(s, MOD))
  159.     {
  160.       ans += fl;
  161.     }
  162.   }
  163.   if (ans > k)
  164.     cout << "NO";
  165.   else
  166.     cout << "YES";
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement