- 문제 : https://www.acmicpc.net/problem/11725
스스로 푼 문제다! Silver Level2 문제
처음에 bfs로 풀었는데, 잘 안돼서 dfs로 변경 후 진행했더니 정답이 떴다.
로직은 탐색을 하면서 v번째 리스트에 있는 원소들의 루트는 v이므로, root 리스트에 이를 입력해 주고,
탐색 여부는 visit 안 한 원소들로만 진행한다(not visit)
recursionError가 발생해서 sys.setrecursionlimit(10**6)을 걸어줬다
그리고 초반에 작성했던 bfs풀이도 정답이 떴지만, 시간이 오래 걸렸다
- 정답 풀이 :
import sys
sys.setrecursionlimit(10**6)
input=sys.stdin.readline
n=int(input())
data=[[] for _ in range(n+1)]
root=[0]*(n+1)
visit=[0]*(n+1)
visit[0]=1
visit[1]=1
for _ in range(n-1):
a,b=map(int,input().split())
data[a].append(b)
data[b].append(a)
data[a].sort()
data[b].sort()
def dfs(v):
visit[v]=1
for i in data[v]:
if not visit[i]:
visit[i]=1
root[i]=v
dfs(i)
dfs(1)
for i in range(2,n+1):
print(root[i])
-BFS 풀이
sys.stdin.readline으로 하면 안 할 때보다 시간이 1/10로 단축된다
from collections import deque
import sys
input=sys.stdin.readline
n=int(input())
data=[[] for _ in range(n+1)]
root=[0]*(n+1)
visit=[0]*(n+1)
visit[0]=1
visit[1]=1
for _ in range(n-1):
a,b=map(int,input().split())
data[a].append(b)
data[b].append(a)
data[a].sort()
data[b].sort()
def bfs(v):
queue=deque()
queue.append(v)
while queue:
x=queue.popleft()
for i in data[x]:
if not visit[i]:
visit[i]=1
root[i]=x
queue.append(i)
bfs(1)
for i in range(2,n+1):
print(root[i])
'백준 > Search' 카테고리의 다른 글
[bfs/백준] 1389번 : 케빈 베이컨의 6단계 법칙 (0) | 2022.07.28 |
---|---|
[bfs/백준] 16236번: 아기 상어 (0) | 2022.07.27 |
[bfs/백준] 10026번 : 적록색약 (0) | 2022.07.24 |
[bfs/백준] 7569번 : 토마토 (0) | 2022.07.24 |
[bfs/백준] 4963번 : 섬의 개수 (0) | 2022.07.23 |