Submission #1317491

#TimeUsernameProblemLanguageResultExecution timeMemory
1317491benedict0724Board Game (JOI24_boardgame)C++20
0 / 100
25 ms5844 KiB
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <iomanip>

using namespace std;
typedef long long ll;

const ll INF = 1e14;

vector<int> adj[50002];
int x[50002];
int n, m, k;

vector<ll> shortest_path(int s, vector<int> dont) {
    queue<int> q;
    vector<ll> d(n);
    q.push(s);
    for(int i=0;i<n;i++) d[i] = INF;
    d[s] = 0;
    
    while(!q.empty()) {
        int now = q.front(); q.pop();
        if(dont[now] && now != s) continue;
        for(int nxt : adj[now]) {
            if(d[nxt] > d[now] + 1) {
                d[nxt] = d[now] + 1;
                q.push(nxt);
            }
        }
    }
    
    return d;
}

vector<ll> next_stop(string s) {
    queue<int> q;
    vector<ll> d(n);
    for(int i=0;i<n;i++) {
        if(s[i] == '0') d[i] = INF;
        else q.push(i);
    }
    
    while(!q.empty()) {
        int now = q.front(); q.pop();
        for(int nxt : adj[now]) {
            if(d[nxt] > d[now] + 1) {
                d[nxt] = d[now] + 1;
                q.push(nxt);
            }
        }
    }
    
    for(int i=0;i<n;i++) if(d[i] == 0) {
        d[i] = 2;
        for(int j : adj[i]) if(s[j] == '1') d[i] = 1;
    }
    
    return d;
}

int main() {
    ios::sync_with_stdio(false); cin.tie(NULL);
    
    cin >> n >> m >> k;
    for(int i=0;i<m;i++) {
        int u, v; cin >> u >> v;
        --u;
        --v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    
    string s; cin >> s;
    
    int st = 0;
    for(int i=0;i<n;i++) {
        if(s[i] == '1') st = i;
    }
    
    for(int i=0;i<k;i++) {
        cin >> x[i];
        --x[i];
    }
    
    vector<int> dont(n, 0);
    vector<ll> v1 = shortest_path(st, dont);
    dont[st] = 1;
    vector<ll> v2 = shortest_path(x[0], dont);
    vector<ll> ns = next_stop(s);
    
    ll Cost = 0;
    for(int i=1;i<k;i++) {
        Cost += ns[i];
    }
    
    vector<ll> ans(n);
    for(int i=0;i<n;i++) {
        ans[i] = min(Cost + v1[x[0]] + v1[i], v2[i]);
    }
    
    for(int i=0;i<n;i++) cout << ans[i] << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...