func_code_string: #include <bits/stdc++.h>   using namespace std;   struct Network {     int N, source, sink;     int M;     struct Edge {       int source, target, id, reverse;     };     vector<vector<Edge>> adjacency_list;     vector<int> capacities, flows, costs;     Network(const int N, const int source, const int sink)         : N(N), source(source), sink(sink), M(0), adjacency_list(N) {}     void add_edge(const int v, const int w, const int capacity, const int cost) {       const auto id = M++;       capacities.push_back(capacity);       costs.push_back(cost);       flows.push_back(0);       const auto reverse = M++;       capacities.push_back(0);       costs.push_back(-cost);       flows.push_back(0);       adjacency_list[v].push_back({v, w, id, reverse});       adjacency_list[w].push_back({w, v, reverse, id});     }     int mcmf() {       auto cost = 0;       while (true) {         const auto infinity = numeric_limits<int>::max();         auto distances = vector<int>(N, infinity);         auto predecessors = vector<Edge>(N);         auto queue = std::queue<int>();         distances[source] = 0;         queue.push(source);         while (!queue.empty()) {           const auto v = queue.front();           queue.pop();           const auto d = distances[v];           for (const auto e : adjacency_list[v]) {             if (flows[e.id] == capacities[e.id]) continue;             const auto relax = d + costs[e.id];             if (relax < distances[e.target]) {               distances[e.target] = relax;               predecessors[e.target] = e;               queue.push(e.target);             }           }         }         if (distances[sink] == infinity)           break;         else {           cost += distances[sink];           for (auto v = sink; v != source; v = predecessors[v].source) {             const auto e = predecessors[v];             flows[e.id]++;             flows[e.reverse]--;           }         }       }       return cost;     }   };   int main() {     ios::sync_with_stdio(false);     cout << setprecision(4) << fixed;     int n, a, b;     cin >> n >> a >> b;     auto p = vector<int>(n);     for (auto i = 0; i < n; i++) {       double x;       cin >> x;       p[i] = int(round(x * 1000));     }     auto u = vector<int>(n);     for (auto i = 0; i < n; i++) {       double x;       cin >> x;       u[i] = int(round(x * 1000));     }     auto source = n, sink = n + 1, pokeball = n + 2, ultraball = n + 3;     auto network = Network(n + 4, source, sink);     network.add_edge(source, pokeball, a, 0);     network.add_edge(source, ultraball, b, 0);     for (auto i = 0; i < n; i++) {       network.add_edge(pokeball, i, 1, -p[i] * 1000);       network.add_edge(ultraball, i, 1, -u[i] * 1000);       network.add_edge(i, sink, 1, 0);       network.add_edge(i, sink, 1, p[i] * u[i]);     }     cout << double(-network.mcmf()) / 1e6 << endl;   }   