Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 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. deque<pair<int, int>> q;
  65. for (auto j : g[i]) {
  66. dist[j.first][j.second] = 0;
  67. q.push_front(j);
  68. }
  69. while (!q.empty()) {
  70. auto s = q.front();
  71. q.pop_front();
  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] == 'S' && dist[nx][ny] > dist[s.first][s.second] + 1) {
  76. dist[nx][ny] = dist[s.first][s.second] + 1;
  77. q.push_back({ nx, ny });
  78. }
  79. else if (0 <= ny && ny < c && 0 <= nx && nx < r && a[nx][ny] == 'X' && dist[nx][ny] > dist[s.first][s.second]) {
  80. dist[nx][ny] = dist[s.first][s.second];
  81. if (vec[nx][ny] != vec[s.first][s.second]) {
  82. f[i][vec[nx][ny]] = min(f[i][vec[nx][ny]], dist[nx][ny]);
  83. }
  84. q.push_front({ nx, ny });
  85. }
  86. }
  87. }
  88. }
  89. vector<vector<int>> dp((1 << it), vector<int>(it, 1e9));
  90. for (int i = 0; i < it; i++) {
  91. dp[(1 << i)][i] = 0;
  92. }
  93. for (int mask = 1; mask < (1 << it); mask++) {
  94. for (int last = 0; last < it; last++) {
  95. if (!((1 << last) & mask)) {
  96. continue;
  97. }
  98. for (int i = 0; i < it; i++) {
  99. if ((mask >> i) & 1) {
  100. dp[mask][last] = min(dp[mask][last], dp[mask - (1 << last)][i] + f[last][i]);
  101. dp[mask][last] = min(dp[mask][last], dp[mask][i] + f[last][i]);
  102. }
  103. }
  104. }
  105. }
  106. int ans = 1e9;
  107. for (int i = 0; i < it; i++) {
  108. ans = min(ans, dp[(1 << it) - 1][i]);
  109. }
  110. cout << ans;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement