#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; class Edge{ public: int to, cap, cost, rev; Edge(){}; Edge(int to0, int cap0, int cost0){to = to0; cap = cap0, cost = cost0;} Edge(int to0, int cap0, int cost0, int rev0){to = to0; cap = cap0; cost = cost0; rev = rev0;} }; int minCostFlow(vector >& edges0, int source, int sink, int flow, bool isDetail = false) { int n = edges0.size(); vector > edges = edges0; for(int i=0; i h(n, 0); vector prevV(n); vector prevE(n); int ret = 0; while(flow > 0){ vector dist(n, INT_MAX); dist[source] = 0; priority_queue ,vector >, greater > > q; q.push(make_pair(0, source)); while(!q.empty()){ pair p = q.top(); q.pop(); int v = p.second; if(dist[v] < p.first) continue; for(unsigned i=0; i 0 && dist[v] + e.cost + h[v] - h[e.to] < dist[e.to]){ dist[e.to] = dist[v] + e.cost + h[v] - h[e.to]; prevV[e.to] = v; prevE[e.to] = i; q.push(make_pair(dist[e.to], e.to)); } } } if(dist[sink] == INT_MAX){ return -1; } for(int i=0; i> n >> a; vector b(a); for(int i=0; i> b[i]; int c; cin >> c; vector d(c); for(int i=0; i> d[i]; sort(b.rbegin(), b.rend()); sort(d.begin(), d.end()); vector > x(n, vector(n, false)); for(int i=0; i > edges(2*n+2); int source = 2 * n; int sink = 2 * n + 1; for(int i=0; i