https://www.acmicpc.net/problem/19538
๋ง์ด ์ด๋ ต์ง ์์ bfs ๋ฌธ์ ์ด๋ค.
์ด ๋ฌธ์ ๋ก bfs ๋ฌธ์ ์ ํ์ ์ก๋๋ฐ ํฐ ๋์์ ๋ฐ์๋ค !
[๋ฌธ์ ์ ์ ์ถ๋ ฅ]
๋ฃจ๋จธ๋ ์ต์ด ์ ํฌ์๋ก๋ถํฐ ์์ํ๋ค. ์ต์ด ์ ํฌ์๋ ์ฌ๋ฌ ๋ช ์ผ ์ ์๊ณ , ์ต์ด ์ ํฌ์๋ฅผ ์ ์ธํ๊ณ ์ค์ค๋ก ๋ฃจ๋จธ๋ฅผ ๋ง๋ค์ด ๋ฏฟ๋ ์ฌ๋์ ์๋ค. ๋งค๋ถ ๋ฃจ๋จธ๋ฅผ ๋ฏฟ๋ ์ฌ๋์ ๋ชจ๋ ์ฃผ๋ณ์ธ์๊ฒ ๋ฃจ๋จธ๋ฅผ ๋์์ ํผํธ๋ฆฌ๋ฉฐ, ๊ตฐ์ค ์ ์ฌ๋์ ์ฃผ๋ณ์ธ์ ์ ๋ฐ ์ด์์ด ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์ ๋ ๋ณธ์ธ๋ ๋ฃจ๋จธ๋ฅผ ๋ฏฟ๋๋ค. ๋ฃจ๋จธ๋ฅผ ๋ฏฟ๋ ์๊ฐ๋ถํฐ ๋ค๋ฅธ ๋ง์ ๋ฃ์ง ์๊ธฐ ๋๋ฌธ์, ํ๋ฒ ๋ฏฟ์ ๋ฃจ๋จธ๋ ๊ณ์ ๋ฏฟ๋๋ค. ์ด๋, ์ฌ๋๋ค์ด ๋ฃจ๋จธ๋ฅผ ์ฒ์ ๋ฏฟ๊ธฐ ์์ํ๋ ์๊ฐ์ ์์๋ด ๋ณด์.
์ ๋ ฅ์ ๊ฐ๋จํ ์ค๋ช ํ๋ฉด
7๋ช ์ ์ฌ๋์ด ์๋ค. (1 ≤ ์ฌ๋ ์ ≤ 200 000)
7๊ฐ ์ค์ ๊ฑธ์ณ ๊ฐ ๋ฒํธ์ ์ฌ๋๊ณผ ์ฐ๊ฒฐ๋ ์ฌ๋์ ์ ๋ ฅ๋ฐ๋๋ฐ
๊ฐ ์ค์์์ 0์ ์ ๋ ฅ์ ๋์ ์๋ฏธํ๋ค.
๊ทธ ์ดํ์ ์ต์ด ์ ํฌ์ ์๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ ์ต์ด ์ ํฌ์ ์ ≤ ์ ์ฒด ์ฌ๋ ์)
2๋ช ์ ์ต์ด ์ ํฌ์๊ฐ ์๋๋ฐ
1๋ฒ๊ณผ 6๋ฒ์ด๋ค.
7๋ช ์ด ๊ฐ์ผ๋ ์๊ฐ์ ํ ์ค์์ ๊ณต๋ฐฑ ๋จ์๋ก ์ถ๋ ฅํ๋ค.
์ต์ด ์ ํฌ์๋ 0๋ถ์ผ๋ก, ๊ฐ์ผ๋์ง ์๋ ์ฌ๋์ -1๋ก ์ถ๋ ฅํ๋ค.
[์๊ณ ๋ฆฌ์ฆ ์ค๋ช : BFS]
BFS๋ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ๊ธฐ๋ฒ ์ค ํ๋์ด๋ค.
๋๋น ์ฐ์ ํ์(Breadth-First Search)์ ๋ฃจํธ ๋ ธ๋(ํน์ ๋ค๋ฅธ ์์์ ๋ ธ๋)์์ ์์ํด์ ์ธ์ ํ ๋ ธ๋๋ฅผ ๋จผ์ ํ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์์ ์ ์ ์ผ๋ก๋ถํฐ ๊ฐ๊น์ด ์ ์ ์ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ ์ ์ ์ ๋์ค์ ๋ฐฉ๋ฌธํ๋ค.
๋ ๋ ธ๋ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก ํน์ ์์์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ณ ์ถ์ ๋ ์ด ๋ฐฉ๋ฒ์ ์ ํํ๋ค.
BFS๋ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ค์ ์ฐจ๋ก๋ก ์ ์ฅํ ํ ๊บผ๋ผ ์ ์๋ ์๋ฃ๊ตฌ์กฐ์ธ ํ(Queue)๋ฅผ ์ฌ์ฉํ๋ค.
์ฆ, ์ ์ ์ ์ถ(FIFO) ์์น์ผ๋ก ํ์ํ๋ค.
[๋ฌธ์ ํ์ด ๋ฐฉ๋ฒ ์ค๋ช ]
bfs ๋ฌธ์ ์ ์ ํ์ ์ธ ํ
์์ 1๋ฒ์ ์ํฉ์ ์ด์ด์ ์๊ฐํด๋ณด๋ ค ํ๋ค.
ํ์๋ ๊ฐ์ผ๋ ์ฌ๋์ ๋ฒํธ๊ฐ ๋ค์ด๊ฐ ์ ์๋ค.
๊ฐ์ฅ ์ฒ์์๋ ์ต์ด ๊ฐ์ผ์์ ๋ฒํธ 1๊ณผ 6์ ํ์ ๋ฃ๋๋ค.
ํ์์ ํ ์ฌ๋(1๋ฒ)์ ๋บ๋ค. ์ด ์ฌ๋์ ์ต์ด ๊ฐ์ผ์์ด๋ฏ๋ก 0๋ถ์ ๊ฐ์ผ๋ ์ฌ๋์ด๋ค. ์ด ์ฌ๋์ ์ฃผ๋ณ์ธ์๊ฒ ์ํฅ์ ์ฃผ์์ ๊ฒ์ด๋ค. ๊ฐ์ผ๋ ์ฌ๋์ ๋ชจ๋ ์ฃผ๋ณ์ธ๋ค(2๋ฒ๊ณผ 3๋ฒ)์ ์ดํด๋ณด์!
2๋ฒ๊ณผ 3๋ฒ ๊ฐ๊ฐ์ ์ฃผ๋ณ์ธ ์ ๋ฐ ์ด์์ด ๊ฐ์ผ๋์๋์ง ํ๋ณํ ๋ค (ํ๋ณ์ ์กฐ๊ธ ๋ค์์ ์ค๋ช ํ๋ค)
์๋ก ๊ฐ์ผ๋์๋ค๋ฉด
ํ์ ๊ฐ์ผ๋ ์ฃผ๋ณ์ธ ๋ฒํธ๋ฅผ ๋ฃ๊ณ
(2๋ฒ์ด ๊ฐ์ผ๋์์ผ๋ฏ๋ก 2๋ ํ์ ์ถ๊ฐํ์ง๋ง 3๋ฒ์ ๊ฐ์ผ๋์ง ์์์ผ๋ฏ๋ก ํ์ ์ถ๊ฐ๋์ง ์๋๋ค)
ํ์์ ๋์จ ์ฌ๋(1)์ ๊ฐ์ผ ์๊ฐ(0๋ถ) + 1๋ถ์ ํด์ ์ ๋ต ๋ฐฐ์ด์ ๊ฐฑ์ ํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ํ์ ๊ฐ์ผ๋ ์ฌ๋์ ๋ฒํธ๊ฐ ์ด์ด์ ๋ค์ด๊ฐ๋ค.
๋ค์ ํ์์ ๊ฐ์ผ๋ ์ฌ๋์ ๋ฒํธ๋ฅผ ๋นผ๋ด์ด ์ฃผ๋ณ์ธ์๊ฒ ๋ผ์น๋ ์ํฅ์ ํ์ํ๋ค.
์์ง ํ์ํ์ง ์๋ ์ต์ด ๋ฐ๊ฒฌ์(6๋ฒ)๊ฐ ์ฃผ๋ณ์ธ์๊ฒ ์ด๋ค ์ํฅ์ ๋ผ์น๋์ง ํ์ํ๊ณ
1๋ถ์ ๊ฐ์ผ๋ ์ฌ๋(2๋ฒ),
…
์ด๋ ๊ฒ ์ด์ด์ ํ์์ ํ๋ค.
ํ์์ ํ๋ค๊ฐ ํ๊ฐ ๋น๋ค๋ ๊ฒ์ ๋ ์ด์ ์๋ก์ด ์ํฅ์ ๋ผ์น ์ฌ๋์ด ์์๋งํผ ๊ฐ์ผ์ด ์ถฉ๋ถํ ์ด๋ฃจ์ด์ก๋ค๋ ๋ป์ด๋ค.
์ ๋ต ๋ฐฐ์ด answer์ ๋ฐํํ๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ๋์ด๋ค.
ํ์ ๋ฐฉ๋ฒ
์ด ๋ฌธ์ ๋ “๊ณผ์ฐ ์ฃผ๋ณ์ธ ์ ๋ฐ ์ด์์ด ๊ฐ์ผ๋์๋์ง์ ๋ํด์๋ ์ด๋ป๊ฒ ํ๋ณํ ๊ฒ์ธ๊ฐ?” ๊ฐ ๊ด๊ฑด์ด๋ค.
1. ๋ช ๋ช ์ด์ ๊ฐ์ผ๋์ด์ผ i๋ฒ ์ฌ๋์ด ๊ฐ์ผ๋๋์ง๋ฅผ ๊ตฌํด turn[i]์ ์ ์ฅํ๋ค.
์ฃผ๋ณ์ธ์ด 4๋ช ์ธ ๊ฒฝ์ฐ, ์ ๋ฐ ์ด์์ธ 2๋ช ์ด์์ด ๊ฐ์ผ๋์ด์ผ ๋ด๊ฐ ๊ฐ์ผ๋๋ค.
์ฃผ๋ณ์ธ์ด 3๋ช ์ธ ๊ฒฝ์ฐ, ์ ๋ฐ ์ด์์ธ 2๋ช ์ด์์ด ๊ฐ์ผ๋์ด์ผ ๋ด๊ฐ ๊ฐ์ผ๋๋ค.
๋ช ๋ช ์ด์ ๊ฐ์ผ๋์ด์ผ ํ๋์ง์ ๋ํ ์๋ (์ฃผ๋ณ์ธ ์ + 1) / 2 ์ฐ์ฐ์ ๋ชซ์ผ๋ก ๊ตฌํ ์ ์๋ค.
2. bfs๋ฅผ ์ํํ๋ฉด์ ๊ฐ์ผ๋ ์ฌ๋(ํ์์ ๋์จ ์ฌ๋)์ ์ฃผ๋ณ์ธ์ ๊ฐ์ผ๊น์ง ๋จ์ ์ฃผ๋ณ์ธ ์ (=turn[i])๋ฅผ 1์ฉ ๋นผ์ค๋ค.
์ด๋ ๊ฒ ํ๋ฉด turn[i]์ ๊ฐ์ด 0๊ณผ ๊ฐ๊ฑฐ๋ 0๋ณด๋ค ์์ ๋, ๊ฐ์ผ๋์์์ ์ฝ๊ฒ ํ๋ณํ ์ ์๋ค.
3. ๊ทธ๋ฐ๋ฐ ์ด๋ฏธ ๊ฐ์ผ๋ ์ฌ๋์ ์๋กญ๊ฒ ๊ฐ์ผ๋ ์ฌ๋์ผ๋ก ํ๋จํ์ฌ ๋ ํ์ํ๋ฉด ์๋๋ค. = ์ค๋ณต๋ ์ซ์๊ฐ ํ์ ๋ค์ด๊ฐ๋ฉด ์๋๋ค.
์๋ฅผ ๋ค์ด๋ณด์!
๋งจ ๋จผ์ 1๋ฒ์ด ๊ฐ์ผ๋์์ ๋ 2๋ฒ์ ๊ฐ์ผ๋์ง๋ง 3๋ฒ์ ์ฃผ๋ณ์ธ์ด ๋ง์์ ๊ฐ์ผ๋์ง ์๋๋ค. ํ์ง๋ง ๋๋ค์ ์ด๋ฏธ ๊ฐ์ผ๋ 1๋ฒ์ ์ค๋ณตํด์ ํ์ํ๋ฉด 3๋ฒ์ ์ด๋ฅผ ์ธ์ํ์ง ๋ชปํ๊ณ 2๋ช ์ด ๊ฐ์ผ๋์๋ค๊ณ ์ธ์ ํด ๊ฐ์ผ์ ๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ์ค๋ณต์ ๋ฐฉ์งํ๊ธฐ ์ํด answer ๋ฐฐ์ด์ ๋งจ ์ฒ์์ -1๋ก ์ด๊ธฐํํด๋๊ณ ,
answer[i]๊ฐ -1์ด๊ณ turn[i]์ด 0๊ณผ ๊ฐ๊ฑฐ๋ 0๋ณด๋ค ์์ ๊ฒฝ์ฐ์ “์๋ก” ๊ฐ์ผ๋จ์ ํ๋ณํ๊ณ ํ์ ๋ฃ์ด์ผ ํ ๊ฒ์ด๋ค.
[C++ ์์ค์ฝ๋]
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
vector<int> solution(int N, vector<vector<int>> E, int M, vector<int> firstInfected) {
queue<int> Q; // ๊ฐ์ผ๋ ์ฌ๋์ ๋ฒํธ๋ฅผ ํ์ ์ ์ฅํ ๊ฒ์ด๋ค.
vector<int> answer(N + 1, -1); // solution ํจ์์์ ๋ฆฌํดํ ๋ฐฐ์ด, ์ฌ์ด์ฆ N+1, -1๋ก ์ด๊ธฐํ
vector<int> turn(N + 1, 0); // ๊ฐ์ผ๊น์ง ๋จ์ ์ฃผ๋ณ ๋น๊ฐ์ผ ์ฌ๋ ์, ์ฌ์ด์ฆ N+1, 0๋ก ์ด๊ธฐํ
// ์ต์กฐ์์ฑ์ ์ฒ๋ฆฌ
for (int t : firstInfected) {
Q.push(t); // ์ต์กฐ์์ฑ์๋ ๊ฐ์ผ๋ ์ฌ๋์ด๊ณ ์ฃผ๋ณ์ธ์๊ฒ ์ํฅ์ ์ฃผ๋ฏ๋ก ํ์ ๋ฃ์ด์ฃผ๊ณ
answer[t] = 0; // 0๋ถ์ ๊ฐ์ผ๋์์์ ์ ์ฅํ๋ค.
}
// ์ฃผ๋ณ์ธ์ ์ ๋ฐ ์ด์์ด ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์ ๋ ๋ณธ์ธ๋ ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์ผ๋ฏ๋ก
// ๋ช ๋ช
์ด ๊ฐ์ผ๋์์ ๋ ์์ ์ด ๊ฐ์ผ๋๋์ง์ ๋ํ ์ ๋ณด๋ฅผ
// ์ฌ๋ i์ ์ฃผ๋ณ์ธ๋ฌผ ์ + 1 / 2์ ๋ชซ์ผ๋ก ์ ์ฅํด๋๋ค.
// ์ฌ๋์ ๋ฒํธ๊ฐ ์๋ ์
๋ ฅ์ ๋์ ๋งํ๋ 0์ด adj ๋ฐฐ์ด์ ํฌํจ๋์ด ์์ผ๋ฏ๋ก + 1์ ์ํด๋ ๋๋ค.
for (int i = 1; i <= N; i++)
turn[i] = E[i].size() / 2;
while (!Q.empty()) { // ํ๊ฐ ๋น ๋๊น์ง ํ์ํ๋๋ฐ, ํ๊ฐ ๋น์๋ค๋ฉด ๋ชจ๋ ํ์์ ๋ง์ณค๋ค๋ ์๋ฏธ์ด๋ค.
int current = Q.front(); // ํ์ฌ, ๊ฐ์ฅ ๋จผ์ ๊ฐ์ผ๋ ์ฌ๋์
Q.pop();
for (int next : E[current]) { // ์ฃผ๋ณ์ธ๋ฌผ๋ค์๊ฒ
if (next == 0) break;
turn[next] -= 1; // ์์ (์ฃผ๋ณ์ธ๋ฌผ)์ด ๊ฐ์ผ๋๊ธฐ๊น์ง ๋จ์ ์ฌ๋ ์๋ฅผ 1 ๋นผ๊ณ
if (answer[next] == -1 && turn[next] <= 0) { // ๋ง์ฝ ์์ง ๊ฐ์ผ๋์ง ์์๊ณ ์ฃผ๋ณ์ธ์ ๋ฐ ์ด์์ด ๊ฐ์ผ๋์๋ค๋ฉด
Q.push(next); // ๊ฐ์ผ๋์๊ธฐ์ ํ์ ์์ ์ ๋ฒํธ๋ฅผ ๋ฃ์ด์ฃผ๊ณ
answer[next] = answer[current] + 1; // ์์ ์ ๊ฐ์ผ์ํจ ๋ง์ง๋ง ์ฃผ๋ณ์ธ์ ๊ฐ์ผ๋ ์๊ฐ + 1๋ถ์ ๋ํด ์ ์ฅํ๋ค.
}
}
}
// ๊ณ์ฐ์ ํธ์๋ฅผ ์ํด ๋ฐฐ์ด์ 0๋ฒ index๊ฐ ์๋ 1๋ฒ index๋ถํฐ ์ ๋ต์ด ์ ์ฅ๋์์ผ๋ฏ๋ก,
// ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ์ง์ฐ๊ณ ๋ฐํํ๋ค.
answer.erase(answer.begin());
return answer;
}
int main() {
int N;
cin >> N;
vector<vector<int>> E(N + 1);
for (int i = 1; i <= N; i++) {
while (1) {
int t;
cin >> t;
E[i].push_back(t);
if (t == 0) break;
}
}
int M;
cin >> M;
vector<int> firstInfected(M);
for (int i = 0; i < M; i++) {
int t;
cin >> t;
firstInfected.push_back(t);
}
vector<int> ans = solution(N, E, M, firstInfected);
for (int i = 0; i < N; i++)
cout << ans[i] << " ";
cout << "\n";
}
[Python ์์ค์ฝ๋]
import sys
from collections import deque
def solution(N, E, M, firstInfected):
Q = deque([]) # ๊ฐ์ผ๋ ์ฌ๋์ ๋ฒํธ๋ฅผ ํ์ ์ ์ฅํ ๊ฒ์ด๋ค.
answer = [-1] * (N+1) # solution ํจ์์์ ๋ฆฌํดํ ๋ฐฐ์ด, ์ฌ์ด์ฆ N+1, -1๋ก ์ด๊ธฐํ
turn = [0] * (N+1) # ๊ฐ์ผ๊น์ง ๋จ์ ์ฃผ๋ณ ๋น๊ฐ์ผ ์ฌ๋ ์, ์ฌ์ด์ฆ N+1, 0๋ก ์ด๊ธฐํ
# ์ต์กฐ์์ฑ์ ์ฒ๋ฆฌ
for t in firstInfected:
Q.append(t) # ์ต์กฐ์์ฑ์๋ ๊ฐ์ผ๋ ์ฌ๋์ด๊ณ ์ฃผ๋ณ์ธ์๊ฒ ์ํฅ์ ์ฃผ๋ฏ๋ก ํ์ ๋ฃ์ด์ฃผ๊ณ
answer[t] = 0 # 0๋ถ์ ๊ฐ์ผ๋์์์ ์ ์ฅํ๋ค.
# ์ฃผ๋ณ์ธ์ ์ ๋ฐ ์ด์์ด ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์ ๋ ๋ณธ์ธ๋ ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์ผ๋ฏ๋ก
# ๋ช ๋ช
์ด ๊ฐ์ผ๋์์ ๋ ์์ ์ด ๊ฐ์ผ๋๋์ง์ ๋ํ ์ ๋ณด๋ฅผ
# ์ฌ๋ i์ ์ฃผ๋ณ์ธ๋ฌผ ์ + 1 / 2์ ๋ชซ์ผ๋ก ์ ์ฅํด๋๋ค.
# ์ฌ๋์ ๋ฒํธ๊ฐ ์๋ ์
๋ ฅ์ ๋์ ๋งํ๋ 0์ด adj ๋ฐฐ์ด์ ํฌํจ๋์ด ์์ผ๋ฏ๋ก + 1์ ์ํด๋ ๋๋ค.
for i in range(1, N+1):
turn[i] = (len(E[i])) // 2
while Q: # ํ๊ฐ ๋น ๋๊น์ง ํ์ํ๋๋ฐ, ํ๊ฐ ๋น์๋ค๋ฉด ๋ชจ๋ ํ์์ ๋ง์ณค๋ค๋ ์๋ฏธ์ด๋ค.
current = Q.popleft() # ํ์ฌ, ๊ฐ์ฅ ๋จผ์ ๊ฐ์ผ๋ ์ฌ๋์
for next in E[current]: # ์ฃผ๋ณ์ธ๋ฌผ๋ค์๊ฒ
if next == 0:
break
turn[next] -= 1 # ์์ (์ฃผ๋ณ์ธ๋ฌผ)์ด ๊ฐ์ผ๋๊ธฐ๊น์ง ๋จ์ ์ฌ๋ ์๋ฅผ 1 ๋นผ๊ณ
if answer[next] == -1 and turn[next] <= 0: # ๋ง์ฝ ์์ง ๊ฐ์ผ๋์ง ์์๊ณ ์ฃผ๋ณ์ธ์ ๋ฐ ์ด์์ด ๊ฐ์ผ๋์๋ค๋ฉด
Q.append(next) # ๊ฐ์ผ๋์๊ธฐ์ ํ์ ์์ ์ ๋ฒํธ๋ฅผ ๋ฃ์ด์ฃผ๊ณ
answer[next] = answer[current] + 1 # ์์ ์ ๊ฐ์ผ์ํจ ๋ง์ง๋ง ์ฃผ๋ณ์ธ์ ๊ฐ์ผ๋ ์๊ฐ + 1๋ถ์ ๋ํด ์ ์ฅํ๋ค.
# ๊ณ์ฐ์ ํธ์๋ฅผ ์ํด ๋ฐฐ์ด์ 0๋ฒ index๊ฐ ์๋ 1๋ฒ index๋ถํฐ ์ ๋ต์ด ์ ์ฅ๋์์ผ๋ฏ๋ก,
# ๋ฐฐ์ด์ ๋๋ฒ์งธ ์์๋ถํฐ ๋ฐํํ๋ค.
return answer[1:]
input = sys.stdin.readline
N = int(input())
E = [[] for _ in range(N+1)]
for i in range(1, N+1):
E[i] = list(map(int, input().split()))
M = int(input())
firstInfected = list(map(int, input().split()))
print(" ".join(map(str, solution(N, E, M, firstInfected))))
[JAVA ์์ค์ฝ๋]
import java.io.*;
import java.util.*;
public class Main {
public static int[] solution(int N, int[][] adj, int M, int[] firstInfected) {
Queue<Integer> Q = new ArrayDeque<>(); // ๊ฐ์ผ๋ ์ฌ๋์ ๋ฒํธ๋ฅผ ํ์ ์ ์ฅํ ๊ฒ์ด๋ค.
int[] answer = new int[N + 1]; // solution ํจ์์์ ๋ฆฌํดํ ๋ฐฐ์ด
Arrays.fill(answer, -1); // ์ฌ์ด์ฆ N+1, -1๋ก ์ด๊ธฐํ
int[] turn = new int[N + 1]; // ๊ฐ์ผ๊น์ง ๋จ์ ์ฃผ๋ณ ๋น๊ฐ์ผ ์ฌ๋ ์
Arrays.fill(turn, 0); // ์ฌ์ด์ฆ N+1, 0๋ก ์ด๊ธฐํ
// ์ต์กฐ์์ฑ์ ์ฒ๋ฆฌ
for (int t : firstInfected) {
Q.add(t); // ์ต์กฐ์์ฑ์๋ ๊ฐ์ผ๋ ์ฌ๋์ด๊ณ ์ฃผ๋ณ์ธ์๊ฒ ์ํฅ์ ์ฃผ๋ฏ๋ก ํ์ ๋ฃ์ด์ฃผ๊ณ
answer[t] = 0; // 0๋ถ์ ๊ฐ์ผ๋์์์ ์ ์ฅํ๋ค.
}
// ์ฃผ๋ณ์ธ์ ์ ๋ฐ ์ด์์ด ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์ ๋ ๋ณธ์ธ๋ ๋ฃจ๋จธ๋ฅผ ๋ฏฟ์ผ๋ฏ๋ก
// ๋ช ๋ช
์ด ๊ฐ์ผ๋์์ ๋ ์์ ์ด ๊ฐ์ผ๋๋์ง์ ๋ํ ์ ๋ณด๋ฅผ
// ์ฌ๋ i์ ์ฃผ๋ณ์ธ๋ฌผ ์ + 1 / 2์ ๋ชซ์ผ๋ก ์ ์ฅํด๋๋ค.
// ์ฌ๋์ ๋ฒํธ๊ฐ ์๋ ์
๋ ฅ์ ๋์ ๋งํ๋ 0์ด adj ๋ฐฐ์ด์ ํฌํจ๋์ด ์์ผ๋ฏ๋ก + 1์ ์ํด๋ ๋๋ค.
for (int i = 1; i <= N; i++)
turn[i] = adj[i].length / 2;
while (!Q.isEmpty()) { // ํ๊ฐ ๋น ๋๊น์ง ํ์ํ๋๋ฐ, ํ๊ฐ ๋น์๋ค๋ฉด ๋ชจ๋ ํ์์ ๋ง์ณค๋ค๋ ์๋ฏธ์ด๋ค.
int current = Q.poll(); // ํ์ฌ, ๊ฐ์ฅ ๋จผ์ ๊ฐ์ผ๋ ์ฌ๋์
for (Integer next : adj[current]) { // ์ฃผ๋ณ์ธ๋ฌผ๋ค์๊ฒ
if (next == 0) break;
turn[next] -= 1; // ์์ (์ฃผ๋ณ์ธ๋ฌผ)์ด ๊ฐ์ผ๋๊ธฐ๊น์ง ๋จ์ ์ฌ๋ ์๋ฅผ 1 ๋นผ๊ณ
if (answer[next] == -1 && turn[next] <= 0) { // ๋ง์ฝ ์์ง ๊ฐ์ผ๋์ง ์์๊ณ ์ฃผ๋ณ์ธ์ ๋ฐ ์ด์์ด ๊ฐ์ผ๋์๋ค๋ฉด
Q.add(next); // ๊ฐ์ผ๋์๊ธฐ์ ํ์ ์์ ์ ๋ฒํธ๋ฅผ ๋ฃ์ด์ฃผ๊ณ
answer[next] = answer[current] + 1; // ์์ ์ ๊ฐ์ผ์ํจ ๋ง์ง๋ง ์ฃผ๋ณ์ธ์ ๊ฐ์ผ๋ ์๊ฐ + 1๋ถ์ ๋ํด ์ ์ฅํ๋ค.
}
}
}
// ๊ณ์ฐ์ ํธ์๋ฅผ ์ํด ๋ฐฐ์ด์ 0๋ฒ index๊ฐ ์๋ 1๋ฒ index๋ถํฐ ์ ๋ต์ด ์ ์ฅ๋์์ผ๋ฏ๋ก,
// ๋ฐฐ์ด์ ๋๋ฒ์งธ ์์๋ถํฐ ์๋ผ ๋ฐํํ๋ค.
return Arrays.copyOfRange(answer, 1, answer.length);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int[][] adj = new int[N+1][];
adj[0] = new int[]{0};
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
List<Integer> arrayList = new ArrayList<>();
while (true) {
int temp = Integer.parseInt(st.nextToken());
arrayList.add(temp);
if (temp == 0) {
adj[i] = arrayList.stream().mapToInt(Integer::intValue).toArray();
break;
}
}
}
int M = Integer.parseInt(br.readLine());
int[] firstInfected = new int[M];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < M; i++) {
int temp = Integer.parseInt(st.nextToken());
firstInfected[i] = temp;
}
Arrays.stream(solution(N, adj, M, firstInfected)).forEach(t -> sb.append(t).append(" "));
System.out.println(sb);
}
}