int n, m, s, A, B; int ans[kMaxN]; std::vector<int> G[kMaxN], _G[kMaxN];
voiddel(std::vector<int> &vec, int p){ std::swap(vec[p], vec[(int)vec.size() - 1]); vec.pop_back(); }
voidbfs1(){ staticint dis[kMaxN]; staticbool vis[kMaxN]; std::queue<int> q; q.emplace(s), dis[s] = 0, vis[s] = 1; for (; !q.empty();) { int u = q.front(); q.pop(); for (auto v : G[u]) { if (!vis[v]) { dis[v] = dis[u] + 1, vis[v] = 1, q.emplace(v); } } } for (int i = 1; i <= n; ++i) ans[i] = std::min(dis[i] * A, (dis[i] / 2) * B + (dis[i] % 2) * A); }
voidbfs2(){ staticint dis[kMaxN]; staticbool vis[kMaxN], have[kMaxN]; std::queue<int> q; q.emplace(s), dis[s] = 0, vis[s] = 1; for (; !q.empty();) { int u = q.front(); q.pop(); for (auto v : G[u]) have[v] = 1; for (auto v : G[u]) { std::vector<int> vec; for (int i = 0; i < (int)_G[v].size(); ++i) { int w = _G[v][i]; if (w != u && !have[w]) { if (!vis[w]) dis[w] = dis[u] + 1, vis[w] = 1, q.emplace(w); vec.emplace_back(i); } } for (auto p : vec) { del(_G[v], p); } } for (auto v : G[u]) have[v] = 0; } for (int i = 1; i <= n; ++i) if (vis[i]) ans[i] = std::min(ans[i], dis[i] * B); }
voiddickdreamer(){ std::cin >> n >> m >> s >> A >> B; for (int i = 1; i <= m; ++i) { int u, v; std::cin >> u >> v; G[u].emplace_back(v), G[v].emplace_back(u); _G[u].emplace_back(v), _G[v].emplace_back(u); } memset(ans, 0x3f, sizeof(ans)); bfs1(), bfs2(); for (int i = 1; i <= n; ++i) std::cout << ans[i] << '\n'; }