-
playdataAlgo DFS,BFS 예제파이썬/알고리즘 공부 2021. 8. 9. 22:41728x90
DFS, BFS예제
바이러스
문제
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.

입력
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
출력
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
예제입력1
7 6 1 2 2 3 1 5 5 2 5 6 4 7
예제출력1
4
DFS풀이
from sys import stdin read = stdin.readline #//어느 노도와 연결되어 있는지 확인하기 위한 dict딕셔너리 생성 dict = {} #//방문 여부 리스트 생성 visited = [] #// 각인덱스 set함수화 해서 중복없애줌 for i in range(int(read())): dict[i+1] = set() #//{1: {2, 5}, 2: {1, 3, 5}, 3: {2}, 4: {7}, 5: {1, 2, 6}, 6: {5}, 7: {4}} 모형 구현 for j in range(int(read())): a, b = map(int,read().split()) dict[a].add(b) dict[b].add(a) #//재귀함수를 이용해 키값의 벨류값중 방문하지 않은 인덱스는 방문처리 해주고 그 벨류값이 또 키값이 되어 계속 돈다 def dfs(start, dict): for i in dict[start]: if i not in visited: visited.append(i) dfs(i, dict) dfs(1, dict) print(len(visited)-1)
BFS풀이
from sys import stdin read = stdin.readline dict = {} visited = \[\] for i in range(int(read())): dict\[i+1\] = set() for j in range(int(read())): a, b = map(int,read().split()) dict\[a\].add(b) dict\[b\].add(a) #// ----여기까지 똑같음 #// pop한 값이 키가 되어 방문하지 않은 값들을 visited리스트에 넣어주면서 계속 돈다. def bfs(start, dict): queue = [start] while queue: for i in dict[queue.pop()]: if i not in visited: queue.append(i) visited.append(i) bfs(1,dict) print(len(visited)-1)'파이썬 > 알고리즘 공부' 카테고리의 다른 글
210826_#1-Stack, Queue (0) 2021.08.25 playdataAlgo 비밀지도🌐, 전화번호 목록☎️ (0) 2021.08.17 playdataAlgo DFS, BFS (0) 2021.08.08 playdata 프로그래머스 체육복 (0) 2021.08.04 playdata 프로그래머스,백준 기초알고리즘5 (0) 2021.08.03