Dense BFS
ย - Last update: 2024-02-29

Dense BFS

inwooleeme ๋‹˜์ด ์•Œ๋ ค์ค€ ๋ฐ€์ง‘ ๊ทธ๋ž˜ํ”„์—์„œ์˜ ๊ทธ๋ž˜ํ”„ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•. ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ํ™•์ธํ•ด๋ณด์ž.

์•„๋ž˜ ๋ธ”๋กœ๊ทธ ๊ธ€๋„ ๋งŽ์ด ์ฐธ๊ณ  ๋˜์—ˆ๋‹ค.

์ผ๋ฐ˜ ์ˆœํšŒ

๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ธธ์ด๊ฐ€ ๋™์ผํ•˜๋ฏ€๋กœ, queue๋ฅผ ์จ์„œ ํ’€์–ด๋ณด์ž. ์ดˆ๊ธฐ์— ์‹œ์ž‘ ์ •์ ์„ ์ง‘์–ด๋„ฃ๊ณ , ์—ฐ๊ฒฐ๋œ edge๋ฅผ ์ˆœํšŒํ•˜๋Š” ์ง€๊ทนํžˆ ํ‰๋ฒ”ํ•œ bfs ์ด๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(V+E)O(V + E)์ด๊ณ , ๋ฐ€์ง‘ ๊ทธ๋ž˜ํ”„์—์„œ๋Š” E=V(Vโˆ’1)E = V(V-1)์ด๋ฏ€๋กœ O(V2)O(V^2)์— ๊ฐ€๊น๊ฒŒ ๋œ๋‹ค.

vector<bool> vis;
vis.resize(N, false);
queue<pair<int,int>> q; // ๊ฐ„์„  ๊ธธ์ด๊ฐ€ ๊ฐ™์œผ๋ฏ€๋กœ pq ์“ฐ๋Š”๊ฑฐ๋‚˜ q ์“ฐ๋Š”๊ฑฐ๋‚˜ ๋˜‘๊ฐ™๋‹ค.
q.push({0, 0}); // vertex, dist
ll ans1 = INF;
while(q.size()) {
auto cur = q.front(); q.pop();
if (cur.first == N - 1) {
ans1 = (ll)cur.second * A;
break;
}
vis[cur.first] = true;
for(auto& nxt: e[cur.first]) {
if (vis[nxt]) continue;
q.push({nxt, cur.second + 1});
}
}

๋ฐ€์ง‘ ์ˆœํšŒ

์ด ๋ถ€๋ถ„์ด ๋‹ค๋ฃจ๊ณ ์ž ํ•˜๋Š” ๋ถ€๋ถ„์ธ๋ฐ, ๋ฐ€์ง‘ ๊ทธ๋ž˜ํ”„์˜ ๊ฒฝ์šฐ ์ง๊ด€์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ •์ ์„ queue์— ๊ณ„์† ๋„ฃ๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ์—๋Š” ๊ฐ™์€ ์ •์ ์ด ๋ฐ˜๋ณตํ•ด์„œ ๊ณ„์† ๋“ค์–ด๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ SPFA์™€ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•˜๊ณ ์ž ํ•˜๋”๋ผ๋„, ์ •์ ์ด ๋น ์ง„ ์ˆœ๊ฐ„์— ๋†’์€ ํ™•๋ฅ ๋กœ ๋‹ค์‹œ queue์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฏ€๋กœ ์ˆ˜ํ–‰์‹œ๊ฐ„์€ ์ค„์–ด๋“ค๋”๋ผ๋„ ์ „์ฒด์ ์ธ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ํฌ๊ฒŒ ์ค„์–ด๋“ค๊ธฐ ์–ด๋ ต๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์ฒ˜๋Ÿผ unvisited set์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋‘๊ณ , unvisited์˜ ์ •์ ์„ ํ•˜๋‚˜์”ฉ ๋นผ๋ฉด์„œ queue์— ๋„ฃ๋Š” ๋ฐฉ์‹์ด ์œ ํšจํ•˜๋‹ค. ๋ฌผ๋ก  dense ํ•˜๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, ๋ชจ๋“  ์ •์ ์ด ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋Š” ์•„๋‹ˆ๋ฏ€๋กœ, ์ด๋ถ„ ํƒ์ƒ‰์„ ํ™œ์šฉํ•ด์„œ ์‹ค์ œ๋กœ ์ด์–ด์ง„ ์ •์ ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ถ„ ํƒ์ƒ‰์„ ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•˜๋Š”๋ฐ์— O(logโกV)O(\log V)์˜ ์‹œ๋ณต๋„๊ฐ€ ๊ฑธ๋ฆฌ๊ณ , MM์„ ์™„์ „ ๊ทธ๋ž˜ํ”„์—์„œ ๋น ์ง„ ๊ฐ„์„ ์˜ ์ˆ˜(dense graph์—์„œ๋Š” ์ž‘์€ ์ˆ˜์ผ ๊ฒƒ์ด๋‹ค)๋กœ ์ •์˜ํ•˜๋ฉด ์ด ๋งŒํผ ์ด๋ถ„ ํƒ์ƒ‰์ด ๋ฐ˜๋ณต๋˜๋ฏ€๋กœ O(MlogโกV)O(M \log V)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ๋‹ค๋ฅธ ๊ด€์ ์—์„œ ๋ชจ๋“  ์ •์ ์ด unvisited๋กœ๋ถ€ํ„ฐ ํ•œ๋ฒˆ์”ฉ ๋น ์ง€๊ฒŒ ๋˜๋ฏ€๋กœ, O(VlogโกV)O(V \log V)์˜ ์‹œ๋ณต๋„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค. ์ด๋ฅผ ์ข…ํ•ฉํ•˜๋ฉด, ์ „์ฒด์ ์ธ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O((M+V)logโกV)O((M + V) \log V)์ด๋‹ค. ์ผ๋ฐ˜์ ์ธ BFS ์‹œ๋ณต๋„์ธ O(V+E)=O(V2)O(V + E) = O(V^2)์— ๋น„ํ•ด ๋งŽ์€ ๊ฐœ์„ ์ด ์žˆ๋‹ค๊ณ  ํ•˜๊ฒ ๋‹ค.

set<int> unvis;
FOR(i,1,N) unvis.insert(i);
q = {};
q.push({0, 0}); // vertex, dist
ll ans2 = INF;
while(q.size()) {
auto cur = q.front(); q.pop();
if (cur.first == N - 1) { // ์—ฌ๊ธฐ๊นŒ์ง„ ๊ฐ™์Œ
ans2 = (ll)cur.second * B;
break;
}
// cur์— ์ด์–ด์ง„ ๊ฐ„์„ ์„ ๋ณด๋Š” ๋Œ€์‹ ์—, unvis ์ค‘์—์„œ ํ•˜๋‚˜๋ฅผ ๋ณธ๋‹ค. (dense ํ•˜๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋‹ค)
for(auto it = unvis.begin(); it != unvis.end(); ) {
int nxt = *it;
if (e[cur.first].find(nxt) == e[cur.first].end()) {
// ์•„์ง ๋ฐฉ๋ฌธ ์•ˆํ•œ ์ •์ ์ด๋‹ค.
q.push({nxt, cur.second + 1});
it = unvis.erase(it);
} else {
++it;
}
}
}

Time Complexity

  • O((M+V)logโกV)O((M + V) \log V)
    • MM์€ ์™„์ „ ๊ทธ๋ž˜ํ”„(E=V(Vโˆ’1)E = V(V-1))์—์„œ ๋น ์ง„ ๊ฐ„์„ ์˜ ์ˆ˜์ด๋‹ค.