Cod sursă (job #431293)

Utilizator avatar Kusika Pasa Corneliu Kusika IP ascuns
Problemă Evacuare (lot liceu) Compilator cpp | 1,13 kb
Rundă Arhiva de probleme Status evaluat
Dată 6 feb. 2019 18:21:25 Scor 100
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

int n, m, x;
int nxt[1<<20], ans[1<<20];
vector<int> g[1<<20];
bool vis[1<<20];

int main() {
    freopen("evacuare.in","r",stdin);
    freopen("evacuare.out","w",stdout);

    scanf("%d %d %d", &n, &m, &x);
    x--;
    for (int i = 0; i < m; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        v--, u--;
        g[u].pb(v);
        g[v].pb(u);
    }
    for (int i = 0; i < n; i++) {
        scanf("%d", nxt + i);
        nxt[i]--;
        ans[i] = (1<<30);
    }

    ans[x] = 0;
    queue<int> q;
    q.push(x);
    vis[x] = 1;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        vis[u] = 0;
        for (auto v : g[u]) {
            int cur;
            if (nxt[u] == v) cur = ans[u];
            else cur = ans[u] + 1;
            if (cur < ans[v]) {
                ans[v] = cur;
                if (!vis[v]) {
                    q.push(v);
                    vis[v];
                }
            }
        }
    }
    for (int i = 0; i < n; i++) {
        printf("%d\n", ans[i]);
    }

}