Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.64 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. #define X first
  4. #define Y second
  5. #define mp make_pair
  6. #define pb push_back
  7. #define pr pair
  8. #define vc vector
  9. #define sz(v) (int) v.size()
  10. #define TASK ""
  11.  
  12. using namespace std;
  13.  
  14. typedef long long ll;
  15. typedef long double ld;
  16.  
  17. const int Q = 20;
  18. const int INF = 2e9;
  19. const vector<int> dx = {0, 1, 0, -1}, dy = {1, 0, -1, 0};
  20.  
  21. int n, m, q;
  22. vc<vc<int>> a, used, numb;
  23. int c[Q];
  24. pr<int, int> b[Q];
  25. vc<int> g[Q];
  26. int vis[Q];
  27.  
  28. bool in(int x, int y) {
  29. return 0 <= x && x < n && 0 <= y && y < m;
  30. }
  31.  
  32. void bfs(int i, int x, int y) {
  33. queue<pr<int, int>> aye;
  34. aye.push(mp(x, y));
  35. used[x][y] = i;
  36. vc<int> curr;
  37. while (!aye.empty()) {
  38. x = aye.front().X, y = aye.front().Y;
  39. aye.pop();
  40. for (int d = 0; d < 4; ++d) {
  41. int nx = x + dx[d], ny = y + dy[d];
  42. if (in(nx, ny) && used[nx][ny] != i && a[nx][ny] != INF) {
  43. used[nx][ny] = i;
  44. if (numb[nx][ny]) {
  45. curr.pb(numb[nx][ny]);
  46. } else {
  47. aye.push(mp(nx, ny));
  48. }
  49. }
  50. }
  51. }
  52. for (int j : curr) g[i].push_back(j - 1);
  53. }
  54.  
  55. void dfs(int i, vc<bool> &need, int col) {
  56. vis[i] = col;
  57. for (int j : g[i]) {
  58. if (need[j] && vis[j] != col) {
  59. dfs(j, need, col);
  60. }
  61. }
  62. }
  63.  
  64. signed main() {
  65. #ifdef LOCAL
  66. freopen("input.txt", "r", stdin);
  67. //freopen("output.txt", "w", stdout);
  68. #else
  69. freopen("input.txt", "r", stdin);
  70. freopen("output.txt", "w", stdout);
  71. #endif
  72. ios::sync_with_stdio(0);
  73. cin.tie(0);
  74.  
  75. cin >> n >> m >> q >> b[0].X >> b[0].Y;
  76. --b[0].X, --b[0].Y;
  77. a.resize(n, vc<int>(m, INF));
  78. used.resize(n, vc<int>(m, -1));
  79. numb.resize(n, vc<int>(m, 0));
  80. for (int i = 0; i < n; ++i) {
  81. string s; cin >> s;
  82. for (int j = 0; j < m; ++j) if (s[j] == '.') a[i][j] = 0;
  83. }
  84. for (int i = 1; i <= q; ++i) {
  85. cin >> b[i].X >> b[i].Y >> c[i];
  86. --b[i].X, --b[i].Y;
  87. a[b[i].X][b[i].Y] = c[i];
  88. }
  89. for (int i = 0; i <= q; ++i) numb[b[i].X][b[i].Y] = i + 1;
  90. for (int i = 0; i <= q; ++i) bfs(i, b[i].X, b[i].Y);
  91. ll ans = 0;
  92. for (int mask = 1; mask < (1 << q); ++mask) {
  93. vc<bool> need(q + 1, false);
  94. ll sum = 0;
  95. for (int i = 0; i < q; ++i) {
  96. if ((1 << i) & mask) {
  97. need[i + 1] = true;
  98. sum += 1ll * c[i + 1];
  99. }
  100. }
  101. dfs(0, need, mask);
  102. bool flag = true;
  103. for (int i = 0; i <= q; ++i) {
  104. if (need[i] && vis[i] != mask) {
  105. flag = false;
  106. break;
  107. }
  108. }
  109. if (flag) ans = max(ans, sum);
  110. }
  111. cout << ans << "\n";
  112.  
  113. return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement