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부터 방문된 점을 순서대로 출력하면 된다.
https://velog.io/@guswl8280/DFSBFS
=>dfs, bfs함수 그대로 이용(graph 입력 방식이 다름)
- 입력받은 데이터의 형태를 변경시킨다.
ex) [[1,2],[1,3],[1,4],[2,4],[3,4]] => [[],[2,3,4],[1,4],[1,4],[1,2,3]]
- 1부터 n까지 숫자가 순서대로 있는지 조사한다.
- 해당 숫자가 있으면 집합에 모두 추가해서 집합 형태로 변경한다.
- 집합에서 해당 숫자는 제외하고 리스트로 만들어 sort()해준다.
- graph에 각 자리에 리스트를 추가해준다.
- 변환된 형태를 각각 dfs, bfs에 넣어서 실행시킨다.
import sys from collections import deque def dfs(graph,v,visited): visited[v]=True print(v,end=' ') for i in graph[v]: if not visited[i]: dfs(graph,i,visited) def bfs(graph,start,visited): queue=deque([start]) visited[start]=True while queue: v=queue.popleft() print(v,end=' ') for i in graph[v]: if not visited[i]: queue.append(i) visited[i] = True n,m,v=map(int, sys.stdin.readline().split()) data=[[]]*(m+1) graph=[[]] for i in range(1,m+1): #데이터 입력 받기 data[i]=list(map(int,sys.stdin.readline().split())) for i in range(1,n+1): s = set() for j in data: #입력받은 데이터 하나씩 조사 if i in j: #i가 있으면 for k in j: #집합에 추가하기 s.add(k) s.remove(i) #해당 순서인 숫자 지우기 sList=list(s) sList.sort() graph.insert(i,sList) #그래프에 추가해서 그래프 생성 visited=[False]*(n+1) dfs(graph,v,visited) print() visited=[False]*(n+1) bfs(graph,v,visited)
from collections import deque def dfs(v): print(v,end=' ') visited[v] = True for e in adj[v]: if not(visited[e]): dfs(e) def bfs(v): q=deque([v]) while q: v=q.popleft() if not(visited[v]): visited[v]=True print(v,end=' ') for e in adj[v]: if not visited[e]: q.append(e) n, m, v = map(int, input().split()) adj = [[] for _ in range(n+1)] for _ in range(m): #입력 형태 변환 x,y=map(int, input().split()) adj[x].append(y) adj[y].append(x) for e in adj: e.sort() visited=[False]*(n+1) dfs(v) print() visited=[False]*(n+1) bfs(v)