문제링크:https://www.acmicpc.net/problem/21606
21606번: 아침 산책
1번 정점에서 시작하고 3, 4번 정점에서 끝나는 경로, 3번 정점에서 시작하고 1, 4번 정점에서 끝나는 경로, 4번 정점에서 시작하고 1, 3, 5번 정점에서 끝나는 경로, 5번 정점에서 시작하고 4번 정점
www.acmicpc.net
다루는 주제: DFS
# N은 정점의 수 N-1은 간선의 수
# 두번쨰 줄은 길이 N의 문자열 A가 주어지는데 0은 실외 1은 실내
# 세번째 줄부터는 트리의 각 정점을 잇는 간선 정보
import sys
sys.setrecursionlimit(10 ** 6)
N = int(sys.stdin.readline()) # 정점수
A = [0] + list(map(int, sys.stdin.readline().strip())) # 실외 실내 정보를 노드 인덱스 1과 맞추기 위해 [0] 추가
tree = [[] for _ in range(N + 1)] # 빈공간 생성
visit = [0] * (N + 1) # 방문 체크
ans = 0
res = 0
for _ in range(N - 1):
a, b = map(int, sys.stdin.readline().split())
tree[a].append(b)
tree[b].append(a)
if A[a] == 1 and A[b] == 1: # 둘다 실내일때 경우
ans += 2 # 서로 방문하는 케이스가 2개
def dfs(v, cnt): # cnt 실외와 연결된 실내 노드 개수
visit[v] = 1
for i in tree[v]:
if A[i] == 0 and visit[i] == 0: # 내 외 내 내 외 일경우 마지막 외가 카운팅 안되는 반례
cnt = dfs(i, cnt) # 해당 실외 기점으로 재귀
elif A[i] == 1 and visit[i] == 0: # 실내면서 방문하지않았다면
cnt += 1
return cnt
for i in range(1, N + 1):
if visit[i] == 0 and A[i] == 0: # 방문안한 실외를 기준으로
x = dfs(i, 0) # dfs시작 cnt는 시작이 0
res += x * (x - 1) # 실외를 기준으로 인접한 실내 점 n개가 있을때 경로는 n(n-1)개이다
print(res + ans)
'Algorithm > 백준(파이썬)' 카테고리의 다른 글
백준 18352 파이썬(Python) 문제풀이 특정 거리의 도시 찾기 (0) | 2023.04.26 |
---|---|
백준 14888 파이썬(Python) 문제풀이 연산자 끼워넣기 (1) | 2023.04.25 |
백준 1707 파이썬(Python) 문제풀이 이분그래프 (0) | 2023.04.24 |
백준 11725 파이썬(Python) 문제풀이 트리의 부모 찾기 (0) | 2023.04.24 |
백준 2178 파이썬(Python) 문제풀이 미로탐색 (0) | 2023.04.23 |