제출 #1338464

#제출 시각아이디문제언어결과실행 시간메모리
1338464trungcanNatjecanje (COCI25_natjecanje)C++20
17 / 110
72 ms17528 KiB
#include <bits/stdc++.h>
#define pii pair<int, int>
#define fi first
#define se second

using namespace std;

const int N = 505;
const int INF = 1e9 + 7;
const int dx[4] = {-1, 0, 0, 1};
const int dy[4] = {0, -1, 1, 0};

int n, m, K, ans;
int dis[70][N][N];
char c[N][N];
bool mark[70];
vector<pii> v;
vector<pair<int, pii>> Q;

bool check(int x, int y){
    return 0 < x && x <= n && 0 < y && y <= m && c[x][y] != '#';
}

void BFS(int k){
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            dis[k][i][j] = INF;
    dis[k][v[k].fi][v[k].se] = 0;

    queue<pii> q;
    q.push({v[k].fi, v[k].se});
    while (!q.empty()){
        int x = q.front().fi, y = q.front().se; q.pop();
        for (int i = 0; i < 4; ++i){
            int nx = x + dx[i], ny = y + dy[i];
            if (check(nx, ny) && dis[k][nx][ny] == INF)
                dis[k][nx][ny] = dis[k][x][y] + 1,
                q.push({nx, ny});
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

    cin >> n >> m >> K;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j) {
            cin >> c[i][j];
            if (c[i][j] == 'S' || c[i][j] == 'X') v.push_back({i, j});
            if (c[i][j] == 'S') swap(v.back(), v[0]);
        }

    for (int i = 0; i <= K; ++i)
        BFS(i);

    for (int i = 1; i <= K; ++i)
        if (dis[0][v[i].fi][v[i].se] == INF)
            return cout << -1, 0;

    for (int i = 1; i < K; ++i)
        for (int j = i + 1; j <= K; ++j)
            if (dis[j][v[i].fi][v[i].se] < dis[0][v[i].fi][v[i].se] + dis[0][v[j].fi][v[j].se])
                Q.push_back({dis[j][v[i].fi][v[i].se] + dis[0][v[i].fi][v[i].se] + dis[0][v[j].fi][v[j].se], {i, j}});

//    for (int x = 0; x <= K; ++x){
//        cout << "\n";
//        for (int i = 1; i <= n; ++i){
//            for (int j = 1; j <= m; ++j) cout << dis[x][i][j] << " "; cout << "\n";
//        }
//    }

    sort(Q.begin(), Q.end());
    for (pair<int, pii> x: Q)
        if (!mark[x.se.fi] && !mark[x.se.se])
            ans += x.fi, mark[x.se.fi] = mark[x.se.se] = 1;//, cout << v[x.se.fi].fi << " " <<  v[x.se.fi].se << "\t" << v[x.se.se].fi << " " << v[x.se.se].se << "\n";
    for (int i = 1; i <= K; ++i)
        if (!mark[i])
            ans += (dis[0][v[i].fi][v[i].se] << 1);

    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...