Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<vector>
- #include<string>
- #include<algorithm>
- #include<iomanip>
- #include<cmath>
- #include<set>
- #include<queue>
- using namespace std;
- vector<vector<bool>> used;
- vector<vector<char>> a;
- vector<pair<int, int>> v = { {0, 1}, {1, 0}, {-1, 0}, {0, -1 } };
- int r, c;
- vector<vector<int>> vec;
- int it = 0;
- void dfs(int x, int y) {
- used[x][y] = 1;
- vec[x][y] = it;
- for (auto u : v) {
- int nx = x + u.first;
- int ny = y + u.second;
- if (0 <= nx && nx < r && 0 <= ny && ny < c && !used[nx][ny] && a[nx][ny] == 'X') {
- dfs(nx, ny);
- }
- }
- }
- signed main()
- {
- cin >> r >> c;
- used.resize(r, vector<bool>(c));
- a.resize(r, vector<char>(c));
- vec.resize(r, vector<int>(c));
- for (int i = 0; i < r; i++) {
- for (int j = 0; j < c; j++) {
- cin >> a[i][j];
- }
- }
- for (int i = 0; i < r; i++) {
- for (int j = 0; j < c; j++) {
- if (!used[i][j] && a[i][j] == 'X') {
- dfs(i, j);
- it++;
- }
- }
- }
- vector<vector<pair<int, int>>> g(it);
- for (int i = 0; i < r; i++) {
- for (int j = 0; j < c; j++) {
- if (a[i][j] == 'X') {
- g[vec[i][j]].push_back({ i, j });
- }
- }
- }
- vector<vector<int>> f(it, vector<int>(it, 1e9));
- for (int i = 0; i < it; i++) {
- f[i][i] = 0;
- }
- for (int i = 0; i < it; i++) {
- vector<vector<int>> dist(r, vector<int>(c, 1e9));
- deque<pair<int, int>> q;
- for (auto j : g[i]) {
- dist[j.first][j.second] = 0;
- q.push_front(j);
- }
- while (!q.empty()) {
- auto s = q.front();
- q.pop_front();
- for (int j = 0; j < 4; j++) {
- int nx = s.first + v[j].first;
- int ny = s.second + v[j].second;
- if (0 <= ny && ny < c && 0 <= nx && nx < r && a[nx][ny] == 'S' && dist[nx][ny] > dist[s.first][s.second] + 1) {
- dist[nx][ny] = dist[s.first][s.second] + 1;
- q.push_back({ nx, ny });
- }
- else if (0 <= ny && ny < c && 0 <= nx && nx < r && a[nx][ny] == 'X' && dist[nx][ny] > dist[s.first][s.second]) {
- dist[nx][ny] = dist[s.first][s.second];
- if (vec[nx][ny] != vec[s.first][s.second]) {
- f[i][vec[nx][ny]] = min(f[i][vec[nx][ny]], dist[nx][ny]);
- }
- q.push_front({ nx, ny });
- }
- }
- }
- }
- vector<vector<int>> dp((1 << it), vector<int>(it, 1e9));
- for (int i = 0; i < it; i++) {
- dp[(1 << i)][i] = 0;
- }
- for (int mask = 1; mask < (1 << it); mask++) {
- for (int last = 0; last < it; last++) {
- if (!((1 << last) & mask)) {
- continue;
- }
- for (int i = 0; i < it; i++) {
- if ((mask >> i) & 1) {
- dp[mask][last] = min(dp[mask][last], dp[mask - (1 << last)][i] + f[last][i]);
- dp[mask][last] = min(dp[mask][last], dp[mask][i] + f[last][i]);
- }
- }
- }
- }
- int ans = 1e9;
- for (int i = 0; i < it; i++) {
- ans = min(ans, dp[(1 << it) - 1][i]);
- }
- cout << ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement