๋ฐ์ํ
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1707
๐ง๐ป๐ป ๋ฌธ์ ํ์ด
- ์ด๋ถ๊ทธ๋ํ ์ด๋ฉด 1, ์ด๋ถ๊ทธ๋ํ๊ฐ ์๋๋ฉด -1๋ฅผ flag์ ์ ์ฅํด์ฃผ์๋ค.
- ์ ์ ์ ๊ฐ๊ฐ 1๊ณผ -1๋ก ๊ตฌ๋ณํด์ฃผ์๋ค. ๋ง์ฝ ์ธ์ ํ ์ ์ ์ด ๋๋ค 1์ด๊ฑฐ๋, ๋๋ค -1์ด๋ผ๋ฉด ์ด๊ฑด ์ด๋ถ๊ทธ๋ํ๊ฐ ์๋๊ฑฐ๋ค! ์ด ๊ฐ๋ค์ visited ์ ๋ฃ์ด์ฃผ์๋ค.
์๋ ์ฝ๋๋ main์ผ๋ก ๋์๊ฐ๋ ๋ถ๋ถ์ด๋ค. ์ฐจ๋ก๋๋ก ์ค๋ช ์ ์์ฑํด๋ณด์๋ฉด
- ์ฒ์ ์ ๋ ฅ๋ฐ๋ K ๋งํผ result๊ฐ ์ถ๋ ฅ๋์ด์ผ ํ๋ฏ๋ก ๋ชจ๋ ๊ณผ์ ์ for๋ฌธ์ผ๋ก ๋ฌถ์ด์ผ ํ๋ค.
- VE์ ์ ์ ๊ฐฏ์ V, ๊ฐ์ ๊ฐฏ์ E๋ฅผ ๋ฐ๋๋ค.
- grpah ๋ ์๋์ ๊ฐ์ ํํ๋ก ๋ฐ์ ๊ฒ์ด๋ค.
- ์ด ๋ฌธ์ ์์ ํต์ฌ์, ๋น์ฐ๊ฒฐ ๊ทธ๋ํ๋ ๋ชจ๋ ํ์ํด์ฃผ์ด์ผ ํ๋จ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ ์ ์ ํ์ํด๋ณด๊ธฐ ์ํด์ for๋ฌธ์ ๋๋ฆด ๋, 1๋ถํฐ VE[0]+1 ๊น์ง ๋๋ ค์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋์ผ for๋ฌธ์์ ํ๋ํ๋ ๋ชจ๋ ์ ์ ์ ํ์ํ๊ณ , ์ธ์ ํ ๊ณณ์ ํ์ํด๋ณผ ์ ์๋ค.
- ์ฒซ ์ ์ ๋ถํฐ ์ฐจ๋ก๋๋ก visited๋ฅผ ํ์ธํ๋ค. 0์ด๊ฒ ๋๋ฉด ๋ฐฉ๋ฌธํ์ง ์์๋ ๋
ธ๋์ด๋ฏ๋ก bfs๋ฅผ ์งํํด์ ํ์ํด ์ค ๊ฒ์ด๋ค.
- ๋ง์ฝ bfs์์ false ๊ฐ ๋์ค๊ฒ ๋๋ค๋ฉด, ์ด๋ถ๊ทธ๋ํ๊ฐ ์๋ ๊ฒ์ด๋ค.
- ๋ฐ๋ก flag์ -1์ ๋ฃ์ด์ฃผ๊ณ breakํด์ for๋ฌธ์ ํ์ถํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ง๊ธ ๋๊ณ ์๋ ๊ฐ์ฅ ์ต์๋จ for๋ฌธ์ด ๋๋๊ธฐ์ ์ YES or NO ๋ฅผ ํ๋จํด์ ์ถ๋ ฅํด์ฃผ์ด์ผํ๋ค.
for _ in 0..<K {
let VE = readLine()!.split(separator: " ").map{ Int(String($0))! }
graph = Array(repeating: [Int](), count: VE[0]+1) // node ์ ๋ณด๋ค +1
visited = Array(repeating: 0, count: VE[0]+1)
flag = 1 // 1: ์ด๋ถ๊ทธ๋ํ, -1: ์๋๊ทธ๋ํ
for _ in 0..<VE[1] {
let uv = readLine()!.split(separator: " ").map{ Int(String($0))! }
graph[uv[0]].append(uv[1])
graph[uv[1]].append(uv[0])
}
for k in 1..<VE[0]+1 {
if visited[k] == 0 {
let tem = bfs(k)
if tem == false {
flag = -1
break
}
}
}
if flag == 1 {
print("YES")
} else if flag == -1 {
print("NO")
}
}
- DFS ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ฐ์ DFS์ ์ง์ ํ์๋ง์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
- ๊ทธ๋ฆฌ๊ณ deque ๋ฐฐ์ด์ ํ์ฌ ๋ฐฉ๋ฌธํ ์ ์ ์ ๋ฃ์ด์ค๋ค.
- deque์๋ ๋ค์ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ค์ ๋ฃ์ด์ฃผ๋ ๋ฆฌ์คํธ๋ก ํ์ฉํ ๊ฒ์ด๋ค. ๊ทธ๋์ ํด๋น deque๋ ์ฐ๊ฒฐ๊ทธ๋ํ๊ฐ ๋๋ ๋๊น์ง ๋น์ง ์๋๋ค. deque๊ฐ ๋น์ด์๋ค๋ ๊ฒ์, ๊ทธ๋ํ๊ฐ ๋๊ฒผ๋ค๋ ๋ป์ด๋ค.
- while๋ฌธ์ ์ง์ ํด์ deque์์ ๊ฐ์ ์์์๋ถํฐ ํ๋์ฉ ๋นผ์ ํ์ํด์ค ๊ฒ์ด๋ค.
func bfs(_ v: Int) -> Bool {
visited[v] = 1
var deque: [Int] = []
deque.append(v)
while !deque.isEmpty {
let a = deque.removeFirst()
for i in graph[a] {
if visited[i] == 0 { //๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ผ๋ฉด
visited[i] = -visited[a] // visited ์๋ 1, -1 ๋ก ์ ์ ์์ ๊ตฌ๋ณ
deque.append(i) //์ฐ๊ฒฐ๋ ๋ค์ ๋
ธ๋๋ i๊ฐ ๋ ๊ฒ
} else {
if visited[i] == visited[a] { // ๊ฐ๋ค๋ฉด, ์ ํ ์ ์ ์ ์์ด ๊ฐ๋ค๋ ๋ป -> false
return false
}
}
}
}
return true
}
๐ป ์ ์ฒด์ฝ๋
let K = Int(String(readLine()!))!
var flag = 0
var graph: [[Int]] = [[]]
var visited: [Int] = []
for _ in 0..<K {
let VE = readLine()!.split(separator: " ").map{ Int(String($0))! }
graph = Array(repeating: [Int](), count: VE[0]+1) // node ์ ๋ณด๋ค +1
visited = Array(repeating: 0, count: VE[0]+1)
flag = 1 // 1: ์ด๋ถ๊ทธ๋ํ, -1: ์๋๊ทธ๋ํ
for _ in 0..<VE[1] {
let uv = readLine()!.split(separator: " ").map{ Int(String($0))! }
graph[uv[0]].append(uv[1])
graph[uv[1]].append(uv[0])
}
for k in 1..<VE[0]+1 {
if visited[k] == 0 {
let tem = bfs(k)
if tem == false {
flag = -1
break
}
}
}
if flag == 1 {
print("YES")
} else if flag == -1 {
print("NO")
}
}
func bfs(_ v: Int) -> Bool {
visited[v] = 1
var deque: [Int] = []
deque.append(v)
while !deque.isEmpty {
let a = deque.removeFirst()
for i in graph[a] {
if visited[i] == 0 { //๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ผ๋ฉด
visited[i] = -visited[a] // visited ์๋ 1, -1 ๋ก ์ ์ ์์ ๊ตฌ๋ณ
deque.append(i) //์ฐ๊ฒฐ๋ ๋ค์ ๋
ธ๋๋ i๊ฐ ๋ ๊ฒ
} else {
if visited[i] == visited[a] { // ๊ฐ๋ค๋ฉด, ์ ํ ์ ์ ์ ์์ด ๊ฐ๋ค๋ ๋ป -> false
return false
}
}
}
}
return true
}
๋ฐ์ํ
'Algorithm > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] (Swift) 4963๋ฒ - ์ฌ์ ๊ฐ์ (DFS ํ์ด) (0) | 2022.06.01 |
---|---|
[๋ฐฑ์ค](Swift) 2667๋ฒ - ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (DFS์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ) (1) | 2022.05.27 |
[๋ฐฑ์ค] (Swift) 14889๋ฒ - ์คํํธ์ ๋งํฌ (DFS-๋ฐฑํธ๋ํน) (0) | 2022.05.23 |
[๋ฐฑ์ค] (Swift) 11724๋ฒ - ์ฐ๊ฒฐ ์์์ ๊ฐ์ (DFS ์ฐ์ต) (0) | 2022.05.20 |
[๋ฐฑ์ค] (Swift) 14501๋ฒ - ํด์ฌ (DP๋ก ํ๊ธฐ) (0) | 2022.05.17 |