Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.48 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<string>
  4. #include<algorithm>
  5. #include<iomanip>
  6. #include<cmath>
  7. #include<set>
  8. #include<queue>
  9.  
  10. using namespace std;
  11.  
  12. vector<vector<bool>> used;
  13. vector<vector<char>> a;
  14. vector<pair<int, int>> v = { {0, 1}, {1, 0}, {-1, 0}, {0, -1} };
  15. int r, c;
  16. vector<vector<int>> vec;
  17. int it = 0;
  18.  
  19. void dfs(int x, int y) {
  20. used[x][y] = 1;
  21. vec[x][y] = it;
  22. for (auto u : v) {
  23. int nx = x + u.first;
  24. int ny = y + u.second;
  25. if (0 <= nx && nx < r && 0 <= ny && ny < c && !used[nx][ny] && a[nx][ny] == 'X') {
  26. dfs(nx, ny);
  27. }
  28. }
  29. }
  30.  
  31. signed main()
  32. {
  33. cin >> r >> c;
  34. used.resize(r, vector<bool>(c));
  35. a.resize(r, vector<char>(c));
  36. vec.resize(r, vector<int>(c));
  37. for (int i = 0; i < r; i++) {
  38. for (int j = 0; j < c; j++) {
  39. cin >> a[i][j];
  40. }
  41. }
  42. for (int i = 0; i < r; i++) {
  43. for (int j = 0; j < c; j++) {
  44. if (!used[i][j] && a[i][j] == 'X') {
  45. dfs(i, j);
  46. it++;
  47. }
  48. }
  49. }
  50. vector<vector<pair<int, int>>> g(it);
  51. for (int i = 0; i < r; i++) {
  52. for (int j = 0; j < c; j++) {
  53. if (a[i][j] == 'X') {
  54. g[vec[i][j]].push_back({ i, j });
  55. }
  56. }
  57. }
  58. vector<vector<int>> f(it, vector<int>(it, 1e9));
  59. for (int i = 0; i < it; i++) {
  60. f[i][i] = 0;
  61. }
  62. for (int i = 0; i < it; i++) {
  63. vector<vector<int>> dist(r, vector<int>(c, 1e9));
  64. queue<pair<int, int>> q;
  65. for (auto j : g[i]) {
  66. dist[j.first][j.second] = 0;
  67. q.push(j);
  68. }
  69. while (!q.empty()) {
  70. auto s = q.front();
  71. q.pop();
  72. for (int j = 0; j < 4; j++) {
  73. int nx = s.first + v[j].first;
  74. int ny = s.second + v[j].second;
  75. if (0 <= ny && ny < c && 0 <= nx && nx < r && a[nx][ny] != '.' && dist[nx][ny] > dist[s.first][s.second] + 1) {
  76. dist[nx][ny] = dist[s.first][s.second] + 1;
  77. q.push({ nx, ny });
  78. if (a[nx][ny] == 'X' && vec[nx][ny] != vec[s.first][s.second]) {
  79. f[i][vec[nx][ny]] = min(f[i][vec[nx][ny]], dist[nx][ny] - 1);
  80. }
  81. }
  82. }
  83. }
  84. }
  85. vector<vector<int>> dp((1 << it), vector<int>((1 << it), 1e9));
  86. for (int i = 0; i < it; i++) {
  87. dp[(1 << i)][i] = 0;
  88. }
  89. for (int mask = 1; mask < (1 << it); mask++) {
  90. for (int last = 0; last < it; last++) {
  91. if (!((1 << last) & mask)) {
  92. continue;
  93. }
  94. for (int i = 0; i < it; i++) {
  95. if ((mask >> i) & 1) {
  96. dp[mask][last] = min(dp[mask][last], dp[mask - (1 << last)][i] + f[last][i]);
  97. }
  98. }
  99. }
  100. }
  101. int ans = 1e9;
  102. for (int i = 0; i < it; i++) {
  103. ans = min(ans, dp[(1 << it) - 1][i]);
  104. }
  105. cout << ans;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement