Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 알고리즘
- 6. 25. 전쟁
- Prim
- 내란수괴
- BFS
- 하버-보슈법
- 내란죄
- 이분 탐색
- 비상계엄
- 왈왈왈
- ccw
- LCA
- 오블완
- dfs
- union find
- 투 포인터
- dfs 백트래킹
- 프림
- 국민의 힘 뿌리
- 다익스트라
- 백준
- 내란수괴 윤석열
- Python
- 분할정복
- DP
- 유니온 파인드
- 구조론
- 재귀함수
- 티스토리챌린지
- 윤석열
Archives
- Today
- Total
Toolofv 님의 블로그
[Python] 백준 - 15681 트리와 쿼리 본문
문제
간선에 가중치와 방향성이 없는 임의의 루트 있는 트리가 주어졌을 때, 아래의 쿼리에 답해보도록 하자.
- 정점 U를 루트로 하는 서브트리에 속한 정점의 수를 출력한다.
만약 이 문제를 해결하는 데에 어려움이 있다면, 하단의 힌트에 첨부한 문서를 참고하자.
입력
트리의 정점의 수 N과 루트의 번호 R, 쿼리의 수 Q가 주어진다. (2 ≤ N ≤ 105, 1 ≤ R ≤ N, 1 ≤ Q ≤ 105)
이어 N-1줄에 걸쳐, U V의 형태로 트리에 속한 간선의 정보가 주어진다. (1 ≤ U, V ≤ N, U ≠ V)
이는 U와 V를 양 끝점으로 하는 간선이 트리에 속함을 의미한다.
이어 Q줄에 걸쳐, 문제에 설명한 U가 하나씩 주어진다. (1 ≤ U ≤ N)
입력으로 주어지는 트리는 항상 올바른 트리임이 보장된다.
출력
Q줄에 걸쳐 각 쿼리의 답을 정수 하나로 출력한다.
문제해결방법 -
1. dfs(깊이 우선 탐색), bfs(너비 우선 탐색) 알고리즘을 이용할 수 있다.
1). bfs의 경우, dfs의 재귀 함수처럼 맨 끝 노드부터 누적되는 구조를 활용할 수 없기 때문에, 다른 장치가 필요하다.
2. dfs로 끝 노드까지 재귀 함수가 실행되고, 방문리스트에 끝 노드의 갯수가 방문리스트[부모노드]에 더해질 수 있도록 구성한다.
3. 그 다음 q줄에 주어지는 U의 값(U를 루트노드로 하는 트리의 갯수)을 출력한다.
- dfs(깊이 우선 탐색)
import sys
from collections import deque
import heapq
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
n, r, q = map(int, input().split())
graph = [[] for _ in range(n+1)]
v = [0 for _ in range(n+1)]
for _ in range(n-1):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
def dfs(idx):
v[idx] = 1
for next in graph[idx]:
if v[next] == 0:
dfs(next)
v[idx] += v[next]
dfs(r)
for i in range(q):
root = int(input())
print(v[root])
- bfs(너비 우선 탐색)
import sys
from collections import deque
import heapq
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
n, r, q = map(int, input().split())
graph = [[] for _ in range(n+1)]
v = [0 for _ in range(n+1)]
root = [0 for _ in range(n+1)]
dp = [1 for _ in range(n+1)]
for _ in range(n-1):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
def bfs(idx):
q = deque([idx])
v[idx] = 1
temp = []
while q:
idx = q.popleft()
temp.append(idx)
for next in graph[idx]:
if v[next] == 0:
v[next] = 1
root[next] = idx
q.append(next)
for i in temp[::-1]:
for j in graph[i]:
if j != root[i]:
dp[i] += dp[j]
return
bfs(r)
for i in range(q):
root = int(input())
print(dp[root])
반응형
'Algorithm' 카테고리의 다른 글
[Python] 백준 - 2213 트리의 독립집합 (0) | 2024.07.15 |
---|---|
[Python] 백준 - 1992 쿼드트리 (0) | 2024.07.12 |
[Python] 백준 - 17472 다리 만들기 2 (0) | 2024.07.11 |
[Python] 백준 - 6497 전력난 (0) | 2024.07.10 |
[Python] 백준 - 4386 별자리 만들기 (0) | 2024.07.08 |