Nearest Shops

Back to Advanced Graph Problems

Implementation

C++

                                #include<bits/stdc++.h>
using namespace std;

const int N = 200005;
vector<int> adj[N];
pair<int,int> dist[N][2];

void solve() {

    int n, m, k;
    cin >> n >> m >> k;

    for(int i=1;i<=n;i++) {
        dist[i][0] = {INT_MAX, INT_MAX};
        dist[i][1] = {INT_MAX, INT_MAX};
    }
    queue<int> q;
    for(int i=0;i<k;i++) {
        int x;
        cin >> x;
        dist[x][0] = {0, x};
        q.push(x);
    }

    for(int i=0;i<m;i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    while(!q.empty()) {
        int u = q.front();
        q.pop();

        for(int v : adj[u]) {
            if(dist[v][0].first > dist[u][0].first + 1) {
                dist[v][1] = dist[v][0];
                dist[v][0] = {dist[u][0].first + 1, dist[u][0].second};
                q.push(v);
            } else if(dist[v][1].first > dist[u][0].first + 1 && dist[v][0].second != dist[u][0].second) {
                dist[v][1] = {dist[u][0].first + 1, dist[u][0].second};
            }
        }
    }
    int ans[n+1];
    for(int i=1;i<=n;i++) {
        ans[i] = INT_MAX;
        if(dist[i][0].first != 0) {
            ans[i] = dist[i][0].first;
        }
    }
    for(int i=1;i<=n;i++) {
        if(dist[i][1].first == INT_MAX || dist[i][1].first == INT_MAX) continue;
        int u = dist[i][0].second;
        int v = dist[i][1].second;
        ans[u] = min(ans[u], dist[i][1].first + dist[i][0].first);
        ans[v] = min(ans[v], dist[i][1].first + dist[i][0].first);
    }

    for(int i=1;i<=n;i++) {
        if(ans[i] == INT_MAX) {
            cout << -1 << " ";
        } else {
            cout << ans[i] << " ";
        }
    }

}

int main() {
    solve();
}