struct Queue<T> {
var input: [T] = []
var output: [T] = []
var isEmpty: Bool {
return input.isEmpty && output.isEmpty
}
var count: Int {
return input.count + output.count
}
mutating func enqueue(_ element: T) {
input.append(element)
}
mutating func delete() -> T {
if output.isEmpty {
output = input.reversed()
input.removeAll()
}
return output.removeLast()
}
}
let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
let (N, M, V) = (input[0], input[1], input[2])
var graph: [[Int]] = Array(repeating: [], count: N+1)
var visited = Array(repeating: false, count: N+1)
var queue = Queue<Int>()
var dfsResult = ""
var bfsResult = ""
for _ in 0..<M {
let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
graph[input[0]].append(input[1])
graph[input[1]].append(input[0])
}
for i in 1...N {
graph[i].sort()
}
dfs(V)
visited = Array(repeating: false, count: N+1)
bfs(V)
print(dfsResult)
print(bfsResult)
func dfs(_ number: Int) {
visited[number] = true
dfsResult += "\(number) "
for node in graph[number] {
if !visited[node] {
dfs(node)
}
}
}
func bfs(_ number: Int) {
visited[number] = true
queue.enqueue(number)
while !queue.isEmpty {
let current = queue.delete()
bfsResult += "\(current) "
for node in graph[current] {
if !visited[node] {
visited[node] = true
queue.enqueue(node)
}
}
}
}
- DFS를 먼저 실행한 후 BFS를 실행하기 전 visited 배열을 초기화해준다.
- BFS에서 큐에 들어온 순서대로 값을 꺼내기 때문에 for문 바깥에서 bfsResult에 값을 추가해도 무방하다.