【最大流,dinic】P2766 最长不下降子序列问题

  1 #include<iostream>
  2 #include<string>
  3 #include<queue>
  4 #include<stack>
  5 #include<vector>
  6 #include<map>
  7 #include<cstdio>
  8 #include<cstdlib>
  9 #include<algorithm>
 10 #include<set>
 11 #include<list>
 12 #include<iomanip>
 13 #include<cstring>
 14 #include<cmath>
 15 #include<limits>
 16 #include<cctype>
 17 using namespace std;
 18 
 19 #define debug(i) cout<<"<debug> "<<i<<" <\debug>"<<endl
 20 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++)
 21 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--)
 22 #define lll __int128
 23 #define Re register
 24 #define mem(a,b) memset(a,(b),sizeof(a))
 25 #define Design ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
 26 typedef pair<int, int> intpair;
 27 typedef pair<long long int, long long int> llpair;
 28 typedef long long int ll;
 29 const int INF = 0x3f3f3f3f;
 30 const long long int INFLL = 0x3f3f3f3f3f3f3f3f;
 31 
 32 int cnt;
 33 int n;
 34 const int maxn = 10010;
 35 int f[maxn];
 36 int a[maxn];
 37 int s;
 38 
 39 struct Edge
 40 {
 41     int v, nxt;
 42     int w;
 43 }e[maxn];
 44 
 45 int head[maxn];
 46 
 47 inline void init()
 48 {
 49     memset(head, -1, sizeof(head));
 50     cnt = 1;
 51 }
 52 
 53 int d[maxn];
 54 int now[maxn];
 55 int st, ed;
 56 
 57 void add_dinic(int u, int v)
 58 {
 59     e[++cnt].v = v;
 60     e[cnt].w = 0;
 61     e[cnt].nxt = head[u];
 62     head[u] = cnt;
 63 }
 64 
 65 int dfs_dinic(int x, int flow)
 66 {
 67     if (x == ed) return flow;
 68     int res = 0;
 69     for (int i = now[x]; i != -1; i = e[i].nxt)
 70     {
 71         int v = e[i].v;
 72         now[x] = i;
 73         if (d[v] + 1 == d[x] && e[i].w > 0)
 74         {
 75             int k = dfs_dinic(v, min(e[i].w, flow));
 76             res += k;
 77             flow -= k;
 78             e[i].w -= k;
 79             e[i ^ 1].w += k;
 80             if (!flow) break;
 81         }
 82     }
 83     return res;
 84 }
 85 
 86 bool bfs_dinic()
 87 {
 88     memset(d, 0, sizeof(d));
 89     queue<int>q;
 90     q.push(ed);
 91     d[ed] = 1;
 92     while (!q.empty())
 93     {
 94         int u = q.front();
 95         q.pop();
 96         for (int i = head[u]; i != -1; i = e[i].nxt)
 97         {
 98             int v = e[i].v;
 99             if (!d[v] && e[i ^ 1].w > 0)
100             {
101                 q.push(v);
102                 d[v] = d[u] + 1;
103             }
104         }
105     }
106     return d[st] > 0;
107 }
108 
109 
110 int dinic()
111 {
112     int flow = 0;
113     while (bfs_dinic())
114     {
115         for (int i = 0; i <= ed; i++) now[i] = head[i];
116         flow += dfs_dinic(st, INF);
117     }
118     return flow;
119 }
120 
121 void add(int u, int v, int w)
122 {
123     e[++cnt].v = v;
124     e[cnt].nxt = head[u];
125     head[u] = cnt;
126     e[cnt].w = w;
127     add_dinic(v, u);
128 }
129 
130 int main()
131 {
132     Design;
133     init();
134     cin >> n;
135     mfor(i, 1, n) f[i] = 1, cin >> a[i];
136     mfor(i, 1, n)
137     {
138         mfor(j, 1, i - 1)
139         {
140             if (a[j] <= a[i]) f[i] = max(f[i], f[j] + 1);
141         }
142     }
143     mfor(i, 1, n) s = max(s, f[i]);
144     cout << s << endl;
145     st = maxn - 2;
146     ed = maxn - 1;
147     mfor(i, 1, n)
148     {
149         add(i, i + n, 1);
150         if (f[i] == 1)
151         {
152             add(st, i, 1);
153         }
154         if (f[i] == s)
155         {
156             add(i + n, ed, 1);
157         }
158     }
159     mfor(i, 1, n)
160     {
161         mfor(j, 1, i - 1)
162         {
163             if (a[j] <= a[i] && f[j] + 1 == f[i]) add(j + n, i, 1);
164         }
165     }
166     int maxf;
167     cout << (maxf = dinic()) << endl;
168     add(1, 1 + n, INF);
169     add(st, 1, INF);
170     if (f[n] == s)
171     {
172         add(n, n + n, INF);
173         add(n + n, ed, INF);
174     }
175     cout << maxf + dinic() << endl;
176 }
View Code

 

posted on 2019-11-26 20:32  thjkhdf12  阅读(104)  评论(0)    收藏  举报