qwerty787788

С++ flow

Mar 28th, 2014
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 KB | None | 0 0
  1. #include <vector>
  2. #include <list>
  3. #include <map>
  4. #include <set>
  5. #include <queue>
  6. #include <deque>
  7. #include <stack>
  8. #include <bitset>
  9. #include <algorithm>
  10. #include <functional>
  11. #include <numeric>
  12. #include <utility>
  13. #include <sstream>
  14. #include <iostream>
  15. #include <iomanip>
  16. #include <cstdio>
  17. #include <cmath>
  18. #include <cstdlib>
  19. #include <ctime>
  20. #include <memory.h>
  21.  
  22. #define pb push_back
  23. #define mp make_pair
  24. #define inf 999999999
  25. #define S second
  26. #define F first
  27.  
  28. using namespace std;
  29.  
  30. struct Edge {
  31.     int to, cap, flow;
  32.     Edge * rev;
  33.  
  34.     Edge(int to, int cap) : to(to), cap(cap), flow(0), rev(NULL) {}
  35. };
  36.  
  37. struct Flow {
  38.     vector<vector<Edge*> > g;
  39.     int to;
  40.     vector<int> cur;
  41.     vector<int> h;
  42.     vector<int> q;
  43.  
  44.     void add_edge(int fr, int to, int cap) {
  45.         Edge * e1 = new Edge(to, cap);
  46.         Edge * e2 = new Edge(fr, 0);
  47.         e1->rev = e2;
  48.         e2->rev = e1;
  49.         g[fr].pb(e1);
  50.         g[to].pb(e2);
  51.     }
  52.  
  53.     Flow(int n) {
  54.         for (int i = 0; i < n; i++) {
  55.             vector<Edge*> tmp;
  56.             g.pb(tmp);
  57.         }
  58.         cur.resize(n);
  59.         h.resize(n);
  60.         q.resize(n);
  61.         to = n - 1;
  62.     }  
  63.  
  64.     bool bfs() {
  65.         int q_it = 0, q_sz = 1;
  66.         for (int i = 0; i < h.size(); i++) h[i] = inf;
  67.         h[0] = 0;
  68.         q[0] = 0;
  69.         while (q_it < q_sz) {
  70.             int v = q[q_it++];
  71.             for (int i = 0; i < g[v].size(); i++) {
  72.                 Edge * e = g[v][i];
  73.                 if (h[e->to] == inf && e->flow < e->cap) {
  74.                     h[e->to] = h[v] + 1;
  75.                     q[q_sz++] = e->to;
  76.                 }
  77.             }
  78.         }
  79.         return h[to] != inf;
  80.     }
  81.  
  82.     int dfs(int v, int f) {
  83.         if (v == to || f == 0)
  84.             return f;
  85.         for (;cur[v] < g[v].size(); cur[v]++) {
  86.             Edge * e = g[v][cur[v]];
  87.             if (h[e->to] == h[v] + 1) {
  88.                 int add = dfs(e->to, min(e->cap - e->flow, f));
  89.                 if (add != 0) {
  90.                     e->flow += add;
  91.                     e->rev->flow -= add;
  92.                     return add;
  93.                 }
  94.             }
  95.         }
  96.         return 0;
  97.     }
  98.  
  99.     int get() {
  100.         int res = 0;
  101.         while (bfs()) {
  102.             for (int i = 0; i < cur.size(); i++) cur[i] = 0;
  103.             while (true) {
  104.                 int add = dfs(0, inf);
  105.                 if (add == 0)
  106.                     break;
  107.                 res += add;
  108.             }
  109.         }
  110.         return res;
  111.     }
  112. };
  113.                                    
  114. int main() {
  115. //  freopen("1.in", "r", stdin);
  116. //  freopen("1.out", "w", stdout);
  117.     int n, m;
  118.     scanf("%d%d", &n, &m);
  119.     Flow f(n + m + 2);
  120.     for (int i = 0; i < m; i++) {
  121.         int val;
  122.         scanf("%d", &val);
  123.         if (val >= 1 && val <= n)
  124.             f.add_edge(i + 1, m + val, 1);
  125.         if (val + 1 >= 1 && val + 1 <= n)
  126.             f.add_edge(i + 1, m + val + 1, 1);
  127.     }
  128.     for (int i = 0; i < m; i++)
  129.         f.add_edge(0, i + 1, 1);
  130.     for (int i = 0; i < n; i++)
  131.         f.add_edge(m + i + 1, n + m + 1, 1);
  132.     int ans = f.get();
  133.     if (ans == m) {
  134.         cout << "YES" << endl;
  135.     } else {
  136.         cout << "NO" << endl;
  137.     }
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment