파이썬/알고리즘 공부

playdataAlgo DFS,BFS 예제

Jimyeung 2021. 8. 9. 22:41
728x90

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)