func_code_string: #include <bits/stdc++.h>   using namespace std;   int maxint = ~0U >> 1;   int flow, cost;   int pi[200001 + 1], v[200001 + 1];   int S, T;   int INF = 1000000000;   int tempAdd = 100000;   struct etype {     int t, c;     etype* next;     etype* pair;     etype() { next = 0; }     etype(int _t, int _c, etype* _n) { t = _t, c = _c, next = _n; }   } * e[200001 + 1], *eb[200001 + 1], *Pe, *Pool;   int aug(int w, int lim) {     int t;     v[w] = 1;     if (w == T) {       flow += lim;       return lim;     }     for (etype*& i = e[w]; i; i = i->next)       if (i->c && !v[i->t] && pi[w] == pi[i->t] + 1)         if (t = aug(i->t, min(lim, i->c))) return i->c -= t, i->pair->c += t, t;     return 0;   }   bool fix() {     int t = maxint;     for (int i = S; i <= T; i++)       if (v[i]) {         for (etype* j = eb[i]; j; j = j->next)           if (j->c && !v[j->t]) t = min(t, pi[j->t] + 1 - pi[i]);       }     if (t == maxint) return 0;     for (int i = S; i <= T; i++)       if (v[i]) e[i] = eb[i], pi[i] += t;     return 1;   }   void addedge(int s, int t, int c) {     ++Pe;     Pe->t = t, Pe->c = c, Pe->next = e[s];     e[s] = Pe;     ++Pe;     Pe->t = s, Pe->c = 0, Pe->next = e[t];     e[t] = Pe;     e[s]->pair = e[t];     e[t]->pair = e[s];   }   void prepare() {     if (Pool == NULL) Pool = new etype[1000001];     Pe = Pool;     memset(e, 0, sizeof(e));   }   int MaxFlow() {     flow = 0, cost = 0;     memcpy(eb, e, sizeof(e));     memset(pi, 0, sizeof(pi));     do {       do memset(v, 0, sizeof(v));       while (aug(S, maxint));     } while (fix());     return flow;   }   int nDog, nPeople;   int oriSex[10001];   int g;   int dogNode(int x) { return 1 + x; }   int peopleNode(int x) { return 1 + 10000 + x; }   int MAIN() {     prepare();     S = 1, T = 1 + 10000 + 2000 + 1;     cin >> nDog >> nPeople >> g;     int ifAllGet = 0;     for (int i = 1; i <= nDog; i++) cin >> oriSex[i];     for (int i = 1; i <= nDog; i++) {       int t;       cin >> t;       addedge(S, dogNode(i), tempAdd);       addedge(dogNode(i), T, tempAdd);       if (oriSex[i] == 0)         addedge(dogNode(i), T, t);       else         addedge(S, dogNode(i), t);     }     for (int i = 1; i <= nPeople; i++) {       addedge(S, peopleNode(i), tempAdd);       addedge(peopleNode(i), T, tempAdd);       int wantSex, pay, needDog;       cin >> wantSex >> pay >> needDog;       ifAllGet += pay;       if (wantSex == 0)         addedge(peopleNode(i), T, pay);       else         addedge(S, peopleNode(i), pay);       for (int j = 1; j <= needDog; j++) {         int t;         cin >> t;         if (wantSex == 1)           addedge(peopleNode(i), dogNode(t), INF);         else           addedge(dogNode(t), peopleNode(i), INF);       }       int isFriend;       cin >> isFriend;       if (isFriend) {         if (wantSex == 0)           addedge(peopleNode(i), T, g);         else           addedge(S, peopleNode(i), g);       }     }     cout << ifAllGet - MaxFlow() + (nDog + nPeople) * tempAdd << endl;     return 0;   }   int main() {     ios ::sync_with_stdio(false);     cout << fixed << setprecision(16);     return MAIN();   }   