1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| map<PII, PII> p;
void add(PII a, PII b, ll c) { if (!p.count(a)) { p[a].first = n + 1; p[a].second = n + 2; n += 2; } if (!p.count(b)) { p[b].first = n + 1; p[b].second = n + 2; n += 2; } e[p[a].second].push_back((edge){p[b].first, c, e[p[b].first].size()}); e[p[b].first].push_back((edge){p[a].second, 0, e[p[a].second].size() - 1}); }
void add(ll a, ll b, ll c) { e[a].push_back((edge){b, c, e[b].size()}); e[b].push_back((edge){a, 0, e[a].size() - 1}); }
void solve() { ll ans = 0, r, c, d; n = 0; s = ++n; t = ++n; cin >> r >> c >> d; string g1[30], g2[30]; for (ll i = 0; i < r; i++) { cin >> g1[i]; } for (ll i = 0; i < r; i++) { cin >> g2[i]; } for (ll i1 = 0; i1 < r; i1++) { for (ll j1 = 0; j1 < c; j1++) { for (ll i2 = -1; i2 <= r; i2++) { for (ll j2 = -1; j2 <= c; j2++) { if ((i1 - i2) * (i1 - i2) + (j1 - j2) * (j1 - j2) <= d * d) { add({i1, j1}, {i2, j2}, inf); } } } add(p[{i1, j1}].first, p[{i1, j1}].second, g1[i1][j1] - '0'); if (g2[i1][j1] == 'L') { add(s, p[{i1, j1}].first, 1); ans++; } } } for (ll i2 = -1; i2 <= r; i2++) { for (ll j2 = -1; j2 <= c; j2++) { if (i2 == -1 || j2 == -1 || i2 == r || j2 == c) { add(p[{i2, j2}].first, t, inf); } } }
while (bfs()) { ans -= dfs(s, inf); } cout << ans << endl; }
|