https://www.acmicpc.net/problem/1260
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
# DFS와 BFS 실버2
from collections import deque, defaultdict
import sys
class Graph :
def __init__(self, V):
self.V = V
self.adj = defaultdict(list) #인접리스트
def addEdge(self, v, w):
self.adj[v].append(w)
self.adj[w].append(v)
def DFS(self, s):
visited = [False]*(self.V+1) #처음에는 모두 미방문
stack = [s] #현재 노드 추가
res = []
while stack :
s = stack.pop() #스택 최상단 팝
if visited[s] == 0: #미방문 노드일시 방문처리
visited[s] = True
res.append(s)
# 현재 노드 s의 모든 인접 노드 검사
# 방문하지 않았다면 스택에 push
for v in sorted(self.adj[s], reverse=True): #작은 노드부터 검사
if not visited[v]:
stack.append(v)
return res
def BFS(self, s):
visited = [False]*(self.V+1) #처음에는 모두 미방문
queue = deque()
queue.append(s)
visited[s] = True
res = []
while queue:
s = queue.popleft()
res.append(s)
# deque한 vertex의 모든 인접 노드들을 얻는다.
# 만약 탐색한 적이 없는 노드라면 방문처리하고 enqueue한다.
for v in sorted(self.adj[s]):
if not visited[v]:
queue.append(v)
visited[v] = True
return res
def printGraph(self):
for k, v in self.adj.items():
print(k, "=>", v)
N, M, V = map(int, sys.stdin.readline().split())
g = Graph(N) #N개의 vertex로 이루어진 그래프
for i in range(M): #간선생성
v1, v2 = map(int, sys.stdin.readline().split())
g.addEdge(v1, v2)
# g.printGraph()
print(*g.DFS(V))
print(*g.BFS(V))
https://velog.io/@iamjinseo/DFSBFS 참고
별 거 없고 DFS와 BFS개념 숙지해서 구현하면 된다.
근데 나는 이 별 거 없는 문제에 몇시간이나 썼다
코드 길이가 좀 길게 나왔는데 printGraph()
부분 없애면 좀 줄어들 것 같다
그리고 시간이 다른 파이썬 유저들 결과보다 훨씬 빨라서 긍정적으로 생각함 (다른 유저들은 400ms시간대)
그래프 탐색..너무 어렵다
어려워서 개념공부까지 했는데도 이런 기본 문제에서 어려움을 느꼈다...
더 열심히 해야지