Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define X first
- #define Y second
- #define mp make_pair
- #define pb push_back
- #define pr pair
- #define vc vector
- #define sz(v) (int) v.size()
- #define TASK ""
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- const int Q = 20;
- const int INF = 2e9;
- const vector<int> dx = {0, 1, 0, -1}, dy = {1, 0, -1, 0};
- int n, m, q;
- vc<vc<int>> a, used, numb;
- int c[Q];
- pr<int, int> b[Q];
- vc<int> g[Q];
- int vis[Q];
- bool in(int x, int y) {
- return 0 <= x && x < n && 0 <= y && y < m;
- }
- void bfs(int i, int x, int y) {
- queue<pr<int, int>> aye;
- aye.push(mp(x, y));
- used[x][y] = i;
- vc<int> curr;
- while (!aye.empty()) {
- x = aye.front().X, y = aye.front().Y;
- aye.pop();
- for (int d = 0; d < 4; ++d) {
- int nx = x + dx[d], ny = y + dy[d];
- if (in(nx, ny) && used[nx][ny] != i && a[nx][ny] != INF) {
- used[nx][ny] = i;
- if (numb[nx][ny]) {
- curr.pb(numb[nx][ny]);
- } else {
- aye.push(mp(nx, ny));
- }
- }
- }
- }
- for (int j : curr) g[i].push_back(j - 1);
- }
- void dfs(int i, vc<bool> &need, int col) {
- vis[i] = col;
- for (int j : g[i]) {
- if (need[j] && vis[j] != col) {
- dfs(j, need, col);
- }
- }
- }
- signed main() {
- #ifdef LOCAL
- freopen("input.txt", "r", stdin);
- //freopen("output.txt", "w", stdout);
- #else
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- ios::sync_with_stdio(0);
- cin.tie(0);
- cin >> n >> m >> q >> b[0].X >> b[0].Y;
- --b[0].X, --b[0].Y;
- a.resize(n, vc<int>(m, INF));
- used.resize(n, vc<int>(m, -1));
- numb.resize(n, vc<int>(m, 0));
- for (int i = 0; i < n; ++i) {
- string s; cin >> s;
- for (int j = 0; j < m; ++j) if (s[j] == '.') a[i][j] = 0;
- }
- for (int i = 1; i <= q; ++i) {
- cin >> b[i].X >> b[i].Y >> c[i];
- --b[i].X, --b[i].Y;
- a[b[i].X][b[i].Y] = c[i];
- }
- for (int i = 0; i <= q; ++i) numb[b[i].X][b[i].Y] = i + 1;
- for (int i = 0; i <= q; ++i) bfs(i, b[i].X, b[i].Y);
- ll ans = 0;
- for (int mask = 1; mask < (1 << q); ++mask) {
- vc<bool> need(q + 1, false);
- ll sum = 0;
- for (int i = 0; i < q; ++i) {
- if ((1 << i) & mask) {
- need[i + 1] = true;
- sum += 1ll * c[i + 1];
- }
- }
- dfs(0, need, mask);
- bool flag = true;
- for (int i = 0; i <= q; ++i) {
- if (need[i] && vis[i] != mask) {
- flag = false;
- break;
- }
- }
- if (flag) ans = max(ans, sum);
- }
- cout << ans << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement