728x90
반응형
# DFS/BFS로 모든 노드 탐색
# visited 목록 만들어서 True 갯수 세면 될듯 !!
import sys
N = int(sys.stdin.readline()) # 노드의 개수
E = int(sys.stdin.readline()) # 간선의 개수
graph = [[] for _ in range(N + 1)] # 노드번호와 동기화 하기 위해 N + 1
for _ in range(E):
root, edge = map(int, sys.stdin.readline().split()) # [1,2] 형태로 입력된다. 1번과 2번에 연결되어 있다는 뜻
graph[root].append(edge) # 무방향(양방향) 그래프이기 때문에 대칭되게 입력해 준다
graph[edge].append(root)
for i in range(1, N + 1): # 키가 작은 노드부터 가야 하기 때문에 인접 노드 리스트를 정렬한다
graph[i].sort
visited = [False] * (N + 1) # 노드번호와 동기화 하기 위해 N + 1
def dfs(graph, v, visited):
visited[v] = True # 왔으니 방문체크
# 출력은 할필요 없으니 패스
for i in graph[v]: # 현재 노드의 인접 노드로 가자
if visited[i] == False: # 인접 노드 아직 안 갔다면 가기
dfs(graph, i, visited)
dfs(graph, 1, visited)
print(visited.count(True) -1) # 감염된 컴퓨터 수가 아니라, 1번에 의해 감염된 컴퓨터 수
DFS/BFS 문제이다. 특정 그래프가 주어지고, 1번 컴퓨터와 연결된 모든 컴퓨터가 감염된다. ( 연결만 되어있다면 건너건너도 감염)
1번 컴퓨터에 의해 감염된 컴퓨터의 개수를 출력하는 문제이다. "1번 컴퓨터는 빼고" 출력해야 한다.
DFS 방식으로 순회하며 방문할 때마다 해당 노드의 visited를 True로 바꿔 주었다. 연결된 곳만 갈 수 있으니, dfs가 끝난 후 True의 개수 - 1를 바로 출력해 주면 된다.
난 BFS 방식으로도 풀어보았다.
from collections import deque
import sys
N = int(sys.stdin.readline())
E = int(sys.stdin.readline())
graph = [[] for _ in range(N + 1)]
for i in range(E):
root, edge = map(int,sys.stdin.readline().split())
graph[root].append(edge)
graph[edge].append(root)
for i in range(1, N + 1):
graph[i].sort()
visited = [False] * (N + 1)
def bfs(graph, start, visited):
queue = deque([start])
visited[start] = True
while queue:
v = queue.popleft()
# 출력 할 필요 없으니 패스
for i in graph[v]: # 방금 꺼낸 노드의 인접 노드 방문여부 체크하고 안갔으면 큐에 넣고 방문처리
if visited[i] == False:
queue.append(i)
visited[i] = True
bfs(graph, 1, visited)
print(visited.count(True) - 1)
728x90
반응형
'Algorithm > DFS' 카테고리의 다른 글
[Baekjoon 21606 / Python / 골드3] 아침 산책 (0) | 2024.09.11 |
---|---|
[Baekjoon 11724 / python / 실버2] 연결 요소의 개수 (0) | 2024.03.30 |
[Baekjoon 11725 / python / 실버2] 트리의 부모 찾기 (2) | 2024.03.30 |
[Baekjoon 1260 / python / 실버2] DFS와 BFS (0) | 2024.03.29 |
[Baekjoon 15649 / python / 실버3] N과 M(1) (0) | 2024.03.24 |