Submission #1338304

#TimeUsernameProblemLanguageResultExecution timeMemory
1338304ahmetlbktd4Natjecanje (COCI25_natjecanje)C++20
43 / 110
1097 ms35456 KiB
#include "bits/stdc++.h"
#define ll long long
#define ff first
#define ss second
using namespace std;

const int N = 505;
const int K = 22;
const ll inf = 1e15;

int n,m,k;
ll s[K],dt[K][K];
ll dp[1<<K];
char a[N][N];

int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};

ll bfs(int sx,int sy,int fx,int fy){
    queue <pair<int,int>> q;
    vector <vector <ll>> d(n,vector <ll> (m,-1));
    q.push({sx,sy});
    d[sx][sy] = 0;
    while (!q.empty()){
        int x = q.front().ff,y = q.front().ss;
        q.pop();
        if (x == fx && y == fy)
        return d[x][y];
        for (int i = 0;i < 4;i++){
            int nx = x + dx[i],ny = y+dy[i];
            if (nx < 0 || nx >= n || ny < 0 || ny >= m)
            continue;
            if (a[nx][ny] == '#')
            continue;
            if (~d[nx][ny])
            continue;
            d[nx][ny] = d[x][y]+1;
            q.push({nx,ny});
        }
    }
    return d[fx][fy];
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m >> k;
    int sx = -1,sy = -1;
    vector <pair<int,int>> c;
    for (int i = 0;i < n;i++){
        for (int j = 0;j < m;j++){
            cin >> a[i][j];
            if (a[i][j] == 'S')
            sx = i,sy = j;
            if (a[i][j] == 'X')
            c.push_back({i,j});
        }   
    }
    for (int i = 0;i < k;i++){
        s[i] = bfs(sx,sy,c[i].ff,c[i].ss);
        for (int j = i+1;j < k;j++){
            dt[i][j] = dt[j][i] = bfs(c[i].ff,c[i].ss,c[j].ff,c[j].ss);
        }
    }
    fill(dp,dp+(1<<k),inf);
    dp[0] = 0;
    for (int mask = 0;mask < (1<<k);mask++){
        if (dp[mask] == inf)
        continue;
        for (int i = 0;i < k;i++){
            if (mask&(1<<i))
            continue;
            if (~s[i]){
                int nm = mask | (1<<i);
                dp[nm] = min(dp[nm],dp[mask]+2*s[i]);
            }
            for (int j = i+1;j < k;j++){
                if (mask & (1<<j))
                continue;
                if (~s[i] && ~s[j] && ~dt[i][j]){
                    int nm = mask | (1<<i) | (1<<j);
                    ll h = min(s[i]+dt[i][j]+s[j],s[j]+dt[j][i]+s[i]);
                    dp[nm] = min(dp[nm],dp[mask]+h);
                }
            }
        }
    }
    if (dp[(1<<k)-1] >= inf)
    cout << "-1\n";
    else cout << dp[(1<<k)-1] << "\n";
}
#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...