Algorithm/문제풀이_백준
[Swift][DFS] 백준 16964번 (DFS 스페셜 저지)
Joahnee
2022. 3. 26. 18:50
요구능력
DFS와 정렬
문제풀이
[Swift][BFS] 백준 16940번 (BFS 스페셜 저지)
요구능력 BFS와 정렬 문제설명 일반적인 BFS문제에 주어진 방문순서대로 방문이 가능한지를 판별하는 문제이다. 간선정보가 주어진다면 인접리스트를 고려해봐야한다. 그래서 인접리스트를 구
sapjilkingios.tistory.com
위의 BFS스페셜저지와 동일한 문제입니다.
바뀌는점은 BFS -> DFS인것 밖에 없습니다.
어려운것없이 1번노드를 먼저방문하도록 dfs(1)로 함수를 호출합니다.
그리고 연결된노드를 깊이우선탐색합니다.
DFS()
func dfs(_ start: Int){
visited[start] = true
result.append(start)
for i in graph[start]{
if !visited[i]{
dfs(i)
}
}
}
후기
BFS스페셜저지에서 DFS로 바꾸기만하면 정답
코드
import Foundation
let n = Int(String(readLine()!))!
var arr = [[Int]]()
var graph = Array(repeating: [Int](), count: n + 1)
for _ in 0..<n-1{
let a = readLine()!.split(separator: " ").map{Int(String($0))!}
graph[a[0]].append(a[1])
graph[a[1]].append(a[0])
}
var order = readLine()!.split(separator: " ").map{Int(String($0))!}
var dfsOrder = Array(repeating: -1, count: order.count + 1)
for i in 0..<order.count{
dfsOrder[order[i]] = i + 1
}
var result = [Int]()
var visited = Array(repeating: false, count: n + 1)
func dfs(_ start: Int){
visited[start] = true
result.append(start)
for i in graph[start]{
if !visited[i]{
dfs(i)
}
}
}
for i in 1...n{
graph[i].sort{dfsOrder[$0] < dfsOrder[$1]}
}
dfs(1)
if result == order {
print(1)
}else{
print(0)
}