#include <bits/stdc++.h>
#define ll long long
#define el cout << '\n'
using namespace std;
const int maxn = 2207;
const ll INF = 1e18;
struct Dinic {
struct Edge {
int to;
int rev;
ll cap;
};
int n;
vector < vector < Edge >> g;
vector < int > lvl, it;
// Mảng lưu cạnh gốc (khi người dùng gọi add_edge)
struct Orig {
int u, v;
ll cap;
int g_index;
};
vector < Orig > orig_edges;
Dinic(int n = 0): n(n), g(n), lvl(n), it(n) {}
void reset(int _n) {
n = _n;
g.assign(n, {});
lvl.assign(n, 0);
it.assign(n, 0);
orig_edges.clear();
}
// add_edge: giờ trả về index của cạnh gốc (nếu cần)
int add_edge(int u, int v, ll c) {
// trước khi push, index trong g[u] sẽ là g[u].size()
int idx_in_gu = (int) g[u].size();
Edge a {
v,
(int) g[v].size(),
c
};
Edge b {
u,
(int) g[u].size(),
0
};
g[u].push_back(a);
g[v].push_back(b);
// lưu thông tin cạnh gốc (forward). Trả về id (index trong orig_edges)
Orig o;
o.u = u;
o.v = v;
o.cap = c;
o.g_index = idx_in_gu;
orig_edges.push_back(o);
return (int) orig_edges.size() - 1;
}
bool bfs(int s, int t) {
fill(lvl.begin(), lvl.end(), -1);
queue < int > q;
q.push(s);
lvl[s] = 0;
while (!q.empty()) {
int v = q.front();
q.pop();
for (auto & e: g[v])
if (e.cap > 0 && lvl[e.to] == -1) {
lvl[e.to] = lvl[v] + 1;
q.push(e.to);
}
}
return lvl[t] != -1;
}
ll dfs(int v, int t, ll f) {
if (v == t || f == 0) return f;
for (int & i = it[v]; i < (int) g[v].size(); ++i) {
Edge & e = g[v][i];
if (e.cap > 0 && lvl[e.to] == lvl[v] + 1) {
ll ret = dfs(e.to, t, min(f, e.cap));
if (ret > 0) {
e.cap -= ret;
g[e.to][e.rev].cap += ret;
return ret;
}
}
}
return 0;
}
ll maxflow(int s, int t) {
ll flow = 0;
while (bfs(s, t)) {
fill(it.begin(), it.end(), 0);
while (true) {
ll pushed = dfs(s, t, INF);
if (!pushed) break;
flow += pushed;
}
}
return flow;
}
vector < char > min_cut_s_side(int s) {
vector < char > vis(n, 0);
queue < int > q;
q.push(s);
vis[s] = 1;
while (!q.empty()) {
int v = q.front();
q.pop();
for (auto & e: g[v])
if (e.cap > 0 && !vis[e.to]) {
vis[e.to] = 1;
q.push(e.to);
}
}
return vis; // vis[u]==1 <=> u in S side
}
// --------- Hàm truy vết các cạnh thuộc min-cut ----------
// Trả về vector các tuple: (u, v, cap_original, flow_sent)
vector < tuple < int, int, ll, ll >> get_min_cut_edges(int s) {
auto sides = min_cut_s_side(s);
vector < tuple < int, int, ll, ll >> res;
for (auto & oe: orig_edges) {
int u = oe.u;
int v = oe.v;
ll cap_orig = oe.cap;
int idx = oe.g_index;
// cap hiện tại của forward edge là g[u][idx].cap
// flow = cap_orig - residual_cap_forward
if (idx < 0 || idx >= (int) g[u].size()) {
// an toàn: phòng trường hợp lỗi lưu vị trí (không nên xảy ra nếu reset/khởi tạo đúng)
continue;
}
ll residual_cap = g[u][idx].cap;
ll flow_sent = cap_orig - residual_cap;
// cạnh nằm trong cut nếu u in S và v in T (reachable từ s hoặc không)
if (sides[u] && !sides[v]) {
res.emplace_back(u, v, cap_orig, flow_sent);
}
}
return res;
}
};
int subtask, n, m;
vector < int > ans[2];
ll cost[2 * maxn + 10];
Dinic D;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
if (fopen("STADIUM.INP", "r"))
{
freopen("STADIUM.INP", "r", stdin);
freopen("STADIUM.OUT", "w", stdout);
}
cin >> subtask;
cin >> n >> m;
D = Dinic(n + m + 2);
for (int i = 1; i <= n; i++)
{
cin >> cost[i];
// cout << 0 << ' ' << i << ' ' << cost[i], el;
D.add_edge(0, i, cost[i]);
}
for (int i = 1; i <= m; i++)
{
cin >> cost[i + n];
// cout << i + n << ' ' << 1 + n + m << ' ' << cost[i + n], el;
D.add_edge(i + n, 1 + n + m, cost[i + n]);
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
char c;
cin >> c;
if (c == '1')
{
// cout << i << ' ' << j + n << ' ' << 1000, el;
// adj[i].push_back(j + n);
// adj[j + n].push_back(i);
D.add_edge(i, j + n, INF);
}
}
// el;
ll min_cost = D.maxflow(0, n + m + 1);
cout << min_cost, el;
for (auto x: D.get_min_cut_edges(0))
{
int u, v;
ll cap, f;
tie(u, v, cap, f) = x;
if (v <= n)
ans[0].push_back(v);
else
ans[1].push_back(u - n);
}
cout << ans[0].size() << ' ';
for (int x: ans[0])
cout << x << ' ';
el;
cout << ans[1].size() << ' ';
for (int x: ans[1])
cout << x << ' ';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGVsIGNvdXQgPDwgJ1xuJwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBtYXhuID0gMjIwNzsKY29uc3QgbGwgSU5GID0gMWUxODsKCnN0cnVjdCBEaW5pYyB7CiAgICBzdHJ1Y3QgRWRnZSB7CiAgICAgICAgaW50IHRvOwogICAgICAgIGludCByZXY7CiAgICAgICAgbGwgY2FwOwogICAgfTsKICAgIGludCBuOwogICAgdmVjdG9yIDwgdmVjdG9yIDwgRWRnZSA+PiBnOwogICAgdmVjdG9yIDwgaW50ID4gbHZsLCBpdDsKCiAgICAvLyBN4bqjbmcgbMawdSBj4bqhbmggZ+G7kWMgKGtoaSBuZ8aw4budaSBkw7luZyBn4buNaSBhZGRfZWRnZSkKICAgIHN0cnVjdCBPcmlnIHsKICAgICAgICBpbnQgdSwgdjsKICAgICAgICBsbCBjYXA7CiAgICAgICAgaW50IGdfaW5kZXg7CiAgICB9OwogICAgdmVjdG9yIDwgT3JpZyA+IG9yaWdfZWRnZXM7CgogICAgRGluaWMoaW50IG4gPSAwKTogbihuKSwgZyhuKSwgbHZsKG4pLCBpdChuKSB7fQogICAgdm9pZCByZXNldChpbnQgX24pIHsKICAgICAgICBuID0gX247CiAgICAgICAgZy5hc3NpZ24obiwge30pOwogICAgICAgIGx2bC5hc3NpZ24obiwgMCk7CiAgICAgICAgaXQuYXNzaWduKG4sIDApOwogICAgICAgIG9yaWdfZWRnZXMuY2xlYXIoKTsKICAgIH0KCiAgICAvLyBhZGRfZWRnZTogZ2nhu50gdHLhuqMgduG7gSBpbmRleCBj4bunYSBj4bqhbmggZ+G7kWMgKG7hur91IGPhuqduKQogICAgaW50IGFkZF9lZGdlKGludCB1LCBpbnQgdiwgbGwgYykgewogICAgICAgIC8vIHRyxrDhu5tjIGtoaSBwdXNoLCBpbmRleCB0cm9uZyBnW3VdIHPhur0gbMOgIGdbdV0uc2l6ZSgpCiAgICAgICAgaW50IGlkeF9pbl9ndSA9IChpbnQpIGdbdV0uc2l6ZSgpOwogICAgICAgIEVkZ2UgYSB7CiAgICAgICAgICAgIHYsCiAgICAgICAgICAgIChpbnQpIGdbdl0uc2l6ZSgpLAogICAgICAgICAgICBjCiAgICAgICAgfTsKICAgICAgICBFZGdlIGIgewogICAgICAgICAgICB1LAogICAgICAgICAgICAoaW50KSBnW3VdLnNpemUoKSwKICAgICAgICAgICAgMAogICAgICAgIH07CiAgICAgICAgZ1t1XS5wdXNoX2JhY2soYSk7CiAgICAgICAgZ1t2XS5wdXNoX2JhY2soYik7CgogICAgICAgIC8vIGzGsHUgdGjDtG5nIHRpbiBj4bqhbmggZ+G7kWMgKGZvcndhcmQpLiBUcuG6oyB24buBIGlkIChpbmRleCB0cm9uZyBvcmlnX2VkZ2VzKQogICAgICAgIE9yaWcgbzsKICAgICAgICBvLnUgPSB1OwogICAgICAgIG8udiA9IHY7CiAgICAgICAgby5jYXAgPSBjOwogICAgICAgIG8uZ19pbmRleCA9IGlkeF9pbl9ndTsKICAgICAgICBvcmlnX2VkZ2VzLnB1c2hfYmFjayhvKTsKICAgICAgICByZXR1cm4gKGludCkgb3JpZ19lZGdlcy5zaXplKCkgLSAxOwogICAgfQoKICAgIGJvb2wgYmZzKGludCBzLCBpbnQgdCkgewogICAgICAgIGZpbGwobHZsLmJlZ2luKCksIGx2bC5lbmQoKSwgLTEpOwogICAgICAgIHF1ZXVlIDwgaW50ID4gcTsKICAgICAgICBxLnB1c2gocyk7CiAgICAgICAgbHZsW3NdID0gMDsKICAgICAgICB3aGlsZSAoIXEuZW1wdHkoKSkgewogICAgICAgICAgICBpbnQgdiA9IHEuZnJvbnQoKTsKICAgICAgICAgICAgcS5wb3AoKTsKICAgICAgICAgICAgZm9yIChhdXRvICYgZTogZ1t2XSkKICAgICAgICAgICAgICAgIGlmIChlLmNhcCA+IDAgJiYgbHZsW2UudG9dID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgbHZsW2UudG9dID0gbHZsW3ZdICsgMTsKICAgICAgICAgICAgICAgICAgICBxLnB1c2goZS50byk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsdmxbdF0gIT0gLTE7CiAgICB9CiAgICBsbCBkZnMoaW50IHYsIGludCB0LCBsbCBmKSB7CiAgICAgICAgaWYgKHYgPT0gdCB8fCBmID09IDApIHJldHVybiBmOwogICAgICAgIGZvciAoaW50ICYgaSA9IGl0W3ZdOyBpIDwgKGludCkgZ1t2XS5zaXplKCk7ICsraSkgewogICAgICAgICAgICBFZGdlICYgZSA9IGdbdl1baV07CiAgICAgICAgICAgIGlmIChlLmNhcCA+IDAgJiYgbHZsW2UudG9dID09IGx2bFt2XSArIDEpIHsKICAgICAgICAgICAgICAgIGxsIHJldCA9IGRmcyhlLnRvLCB0LCBtaW4oZiwgZS5jYXApKTsKICAgICAgICAgICAgICAgIGlmIChyZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgZS5jYXAgLT0gcmV0OwogICAgICAgICAgICAgICAgICAgIGdbZS50b11bZS5yZXZdLmNhcCArPSByZXQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGxsIG1heGZsb3coaW50IHMsIGludCB0KSB7CiAgICAgICAgbGwgZmxvdyA9IDA7CiAgICAgICAgd2hpbGUgKGJmcyhzLCB0KSkgewogICAgICAgICAgICBmaWxsKGl0LmJlZ2luKCksIGl0LmVuZCgpLCAwKTsKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgIGxsIHB1c2hlZCA9IGRmcyhzLCB0LCBJTkYpOwogICAgICAgICAgICAgICAgaWYgKCFwdXNoZWQpIGJyZWFrOwogICAgICAgICAgICAgICAgZmxvdyArPSBwdXNoZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZsb3c7CiAgICB9CiAgICB2ZWN0b3IgPCBjaGFyID4gbWluX2N1dF9zX3NpZGUoaW50IHMpIHsKICAgICAgICB2ZWN0b3IgPCBjaGFyID4gdmlzKG4sIDApOwogICAgICAgIHF1ZXVlIDwgaW50ID4gcTsKICAgICAgICBxLnB1c2gocyk7CiAgICAgICAgdmlzW3NdID0gMTsKICAgICAgICB3aGlsZSAoIXEuZW1wdHkoKSkgewogICAgICAgICAgICBpbnQgdiA9IHEuZnJvbnQoKTsKICAgICAgICAgICAgcS5wb3AoKTsKICAgICAgICAgICAgZm9yIChhdXRvICYgZTogZ1t2XSkKICAgICAgICAgICAgICAgIGlmIChlLmNhcCA+IDAgJiYgIXZpc1tlLnRvXSkgewogICAgICAgICAgICAgICAgICAgIHZpc1tlLnRvXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgcS5wdXNoKGUudG8pOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdmlzOyAvLyB2aXNbdV09PTEgPD0+IHUgaW4gUyBzaWRlCiAgICB9CgogICAgLy8gLS0tLS0tLS0tIEjDoG0gdHJ1eSB24bq/dCBjw6FjIGPhuqFuaCB0aHXhu5ljIG1pbi1jdXQgLS0tLS0tLS0tLQogICAgLy8gVHLhuqMgduG7gSB2ZWN0b3IgY8OhYyB0dXBsZTogKHUsIHYsIGNhcF9vcmlnaW5hbCwgZmxvd19zZW50KQogICAgdmVjdG9yIDwgdHVwbGUgPCBpbnQsIGludCwgbGwsIGxsID4+IGdldF9taW5fY3V0X2VkZ2VzKGludCBzKSB7CiAgICAgICAgYXV0byBzaWRlcyA9IG1pbl9jdXRfc19zaWRlKHMpOwogICAgICAgIHZlY3RvciA8IHR1cGxlIDwgaW50LCBpbnQsIGxsLCBsbCA+PiByZXM7CiAgICAgICAgZm9yIChhdXRvICYgb2U6IG9yaWdfZWRnZXMpIHsKICAgICAgICAgICAgaW50IHUgPSBvZS51OwogICAgICAgICAgICBpbnQgdiA9IG9lLnY7CiAgICAgICAgICAgIGxsIGNhcF9vcmlnID0gb2UuY2FwOwogICAgICAgICAgICBpbnQgaWR4ID0gb2UuZ19pbmRleDsKICAgICAgICAgICAgLy8gY2FwIGhp4buHbiB04bqhaSBj4bunYSBmb3J3YXJkIGVkZ2UgbMOgIGdbdV1baWR4XS5jYXAKICAgICAgICAgICAgLy8gZmxvdyA9IGNhcF9vcmlnIC0gcmVzaWR1YWxfY2FwX2ZvcndhcmQKICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IChpbnQpIGdbdV0uc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAvLyBhbiB0b8OgbjogcGjDsm5nIHRyxrDhu51uZyBo4bujcCBs4buXaSBsxrB1IHbhu4sgdHLDrSAoa2jDtG5nIG7Dqm4geOG6o3kgcmEgbuG6v3UgcmVzZXQva2jhu59pIHThuqFvIMSRw7puZykKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxsIHJlc2lkdWFsX2NhcCA9IGdbdV1baWR4XS5jYXA7CiAgICAgICAgICAgIGxsIGZsb3dfc2VudCA9IGNhcF9vcmlnIC0gcmVzaWR1YWxfY2FwOwoKICAgICAgICAgICAgLy8gY+G6oW5oIG7hurFtIHRyb25nIGN1dCBu4bq/dSB1IGluIFMgdsOgIHYgaW4gVCAocmVhY2hhYmxlIHThu6sgcyBob+G6t2Mga2jDtG5nKQogICAgICAgICAgICBpZiAoc2lkZXNbdV0gJiYgIXNpZGVzW3ZdKSB7CiAgICAgICAgICAgICAgICByZXMuZW1wbGFjZV9iYWNrKHUsIHYsIGNhcF9vcmlnLCBmbG93X3NlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICB9Cn07CgppbnQgc3VidGFzaywgbiwgbTsKdmVjdG9yIDwgaW50ID4gYW5zWzJdOwpsbCBjb3N0WzIgKiBtYXhuICsgMTBdOwpEaW5pYyBEOwoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsKICAgIGNvdXQudGllKDApOwogICAgaWYgKGZvcGVuKCJTVEFESVVNLklOUCIsICJyIikpCiAgICB7CiAgICAgICAgZnJlb3BlbigiU1RBRElVTS5JTlAiLCAiciIsIHN0ZGluKTsKICAgICAgICBmcmVvcGVuKCJTVEFESVVNLk9VVCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KCiAgICBjaW4gPj4gc3VidGFzazsKICAgIGNpbiA+PiBuID4+IG07CiAgICBEID0gRGluaWMobiArIG0gKyAyKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgIHsKICAgICAgICBjaW4gPj4gY29zdFtpXTsKICAgICAgICAvLyBjb3V0IDw8IDAgPDwgJyAnIDw8IGkgPDwgJyAnIDw8IGNvc3RbaV0sIGVsOwogICAgICAgIEQuYWRkX2VkZ2UoMCwgaSwgY29zdFtpXSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpKyspCiAgICB7CiAgICAgICAgY2luID4+IGNvc3RbaSArIG5dOwogICAgICAgIC8vIGNvdXQgPDwgaSArIG4gPDwgJyAnIDw8IDEgKyBuICsgbSA8PCAnICcgPDwgY29zdFtpICsgbl0sIGVsOwogICAgICAgIEQuYWRkX2VkZ2UoaSArIG4sIDEgKyBuICsgbSwgY29zdFtpICsgbl0pOwogICAgfQogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IG07IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGNoYXIgYzsKICAgICAgICAgICAgY2luID4+IGM7CiAgICAgICAgICAgIGlmIChjID09ICcxJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY291dCA8PCBpIDw8ICcgJyA8PCBqICsgbiA8PCAnICcgPDwgMTAwMCwgZWw7CiAgICAgICAgICAgICAgICAvLyBhZGpbaV0ucHVzaF9iYWNrKGogKyBuKTsKICAgICAgICAgICAgICAgIC8vIGFkaltqICsgbl0ucHVzaF9iYWNrKGkpOwogICAgICAgICAgICAgICAgRC5hZGRfZWRnZShpLCBqICsgbiwgSU5GKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIC8vIGVsOwogICAgbGwgbWluX2Nvc3QgPSBELm1heGZsb3coMCwgbiArIG0gKyAxKTsKICAgIGNvdXQgPDwgbWluX2Nvc3QsIGVsOwogICAgZm9yIChhdXRvIHg6IEQuZ2V0X21pbl9jdXRfZWRnZXMoMCkpCiAgICB7CiAgICAgICAgaW50IHUsIHY7CiAgICAgICAgbGwgY2FwLCBmOwogICAgICAgIHRpZSh1LCB2LCBjYXAsIGYpID0geDsKICAgICAgICBpZiAodiA8PSBuKQogICAgICAgICAgICBhbnNbMF0ucHVzaF9iYWNrKHYpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgYW5zWzFdLnB1c2hfYmFjayh1IC0gbik7CiAgICB9CiAgICBjb3V0IDw8IGFuc1swXS5zaXplKCkgPDwgJyAnOwogICAgZm9yIChpbnQgeDogYW5zWzBdKQogICAgICAgIGNvdXQgPDwgeCA8PCAnICc7CiAgICBlbDsKICAgIGNvdXQgPDwgYW5zWzFdLnNpemUoKSA8PCAnICc7CiAgICBmb3IgKGludCB4OiBhbnNbMV0pCiAgICAgICAgY291dCA8PCB4IDw8ICcgJzsKfQ==