Advertisement
Guest User

H - Eating Pie

a guest
Aug 29th, 2017
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef vector<int> vi;
  5.  
  6. const int INF = 1000000000;
  7. const int N=1010;
  8. int n,m,a,b,c,k;
  9. int x[N], y[N];
  10. int p[N];
  11. int cost[N][N];
  12.  
  13. struct edge {
  14.     int a, b, cap, flow;
  15.     edge() {}
  16.     edge(int a, int b, int cap, int flow):a(a), b(b), cap(cap), flow(flow){}
  17. };
  18.  
  19. int so, si, d[N], ptr[N], q[N];
  20. vector<edge> e;
  21. vi g[N];
  22.  
  23. void add_edge (int a, int b, int cap) {
  24.     edge e1(a, b, cap, 0 );
  25.     edge e2(b, a, 0, 0 ); //back edge
  26.     g[a].push_back ((int) e.size());
  27.     e.push_back(e1);
  28.     g[b].push_back ((int) e.size());
  29.     e.push_back(e2);
  30. }
  31.  
  32. bool bfs() {
  33.     int qh=0, qt=0;
  34.     q[qt++]=so;
  35.     memset (d, -1, sizeof d);
  36.     d[so] = 0;
  37.     while(qh<qt && d[si]==-1) {
  38.         int v=q[qh++];
  39.         for(size_t i=0; i<g[v].size(); ++i) {
  40.             int id = g[v][i],
  41.             to = e[id].b;
  42.             if(d[to] == -1 && e[id].flow < e[id].cap) {
  43.                 q[qt++]=to;
  44.                 d[to] = d[v] + 1;
  45.             }
  46.         }
  47.     }
  48.     return d[si]!=-1;
  49. }
  50.  
  51. int dfs (int v, int flow) {
  52.     if (!flow)  return 0;
  53.     if (v == si)  return flow;
  54.     for (; ptr[v]<(int)g[v].size(); ++ptr[v]) {
  55.         int id = g[v][ptr[v]],
  56.         to = e[id].b;
  57.         if (d[to] != d[v] + 1)  continue;
  58.         int pushed = dfs (to, min (flow, e[id].cap - e[id].flow));
  59.         if (pushed) {
  60.             e[id].flow += pushed;
  61.             e[id^1].flow -= pushed;
  62.             return pushed;
  63.         }
  64.     }
  65.     return 0;
  66. }
  67.  
  68. int dinic() {
  69.     int flow = 0;
  70.     for (;;) {
  71.         if (!bfs())  break;
  72.         memset (ptr, 0, sizeof ptr);
  73.         while (int pushed = dfs (so, INF))
  74.             flow += pushed;
  75.     }
  76.     return flow;
  77. }
  78.  
  79. int main(void)
  80. {
  81.     cin >> k >> n >> a >> b;
  82.     int ans = 0;
  83.     for (int i = 0; i < a; ++i)
  84.     {
  85.         cin >> c;
  86.         x[c] = 1;
  87.     }
  88.    
  89.     for (int i = 0; i < b; ++i)
  90.     {
  91.         cin >> c;
  92.         y[c] = 1;
  93.     }
  94.  
  95.     for (int i = 1; i <= n; ++i)
  96.     {
  97.         cin >> p[i];
  98.     }
  99.    
  100.     for (int i = 1; i <= n - 1; ++i)
  101.     {
  102.         cin >> c;
  103.         ans += c;
  104.         cost[p[i]][p[i + 1]] += c;
  105.     }
  106.    
  107.     so = 0;
  108.     si = k + 1;
  109.    
  110.    
  111.     for (int i = 1; i <= k; ++i)
  112.     {
  113.         if (!y[i])
  114.             add_edge(so, i, INF);
  115.         if (!x[i])
  116.             add_edge(i,si, INF);
  117.     }
  118.    
  119.     for (int i = 1; i <= k; ++i)
  120.     {
  121.         for (int j = 1; j <= k; ++j)
  122.         {
  123.             if (cost[i][j])
  124.             {
  125.                 add_edge(i, j, cost[i][j]);
  126.                 add_edge(j, i, cost[i][j]);
  127.             }
  128.         }
  129.     }
  130.    
  131.     cout << ans - dinic() << "\n";
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement