๋ฐ์ํ
๊ทธ๋ํ(Graph)
- ๋ ธ๋(Node)์ ๋ ธ๋ ์ฌ์ด์ ์ฐ๊ฒฐ๋ ๊ฐ์ (Edge)์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ์๋ฃ๊ตฌ์กฐ
- ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด(ํน์ ๊ฐ์ฒด)(Object)๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค๋ ๋ฌธ์ ๋ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ ๋ ์ฌ๋ฆฌ๊ธฐ
- ๊ทธ๋ํ ๊ตฌํ ๋ฐฉ๋ฒ
- ์ธ์ ํ๋ ฌ(Adjacency Matrix) : 2์ฐจ์ ๋ฐฐ์ด ์ฌ์ฉ
- ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ง์ด ํ์ํ์ง๋ง ํน์ ๋ ธ๋ ๊ฐ ๊ฐ์ ์ ๋น์ฉ์ O(1) ์๊ฐ์ผ๋ก ์ฆ์ ์ ์ ์์
- ์ธ์ ๋ฆฌ์คํธ (Adjacency List) : ๋ฆฌ์คํธ ์ฌ์ฉ
- ๊ฐ์ ์ ๊ฐ์์ธ O(E) ๋งํผ๋ง ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ์ํ์ง๋ง O(V) ์๊ฐ ์์
- ์ธ์ ํ๋ ฌ(Adjacency Matrix) : 2์ฐจ์ ๋ฐฐ์ด ์ฌ์ฉ
๊ทธ๋ํ | ํธ๋ฆฌ | |
๋ฐฉํฅ์ฑ | ๋ฐฉํฅ ๊ทธ๋ํ ํน์ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ | ๋ฐฉํฅ ๊ทธ๋ํ |
์ํ์ฑ | ์ํ ๋ฐ ๋น์ํ | ๋น์ํ |
๋ฃจํธ ๋ ธ๋ ์กด์ฌ ์ฌ๋ถ | ๋ฃจํธ ๋ ธ๋๊ฐ ์์ | ๋ฃจํธ ๋ ธ๋๊ฐ ์กด์ฌ |
๋ ธ๋๊ฐ ๊ด๊ณ์ฑ | ๋ถ๋ชจ์ ์์ ๊ด๊ณ ์์ | ๋ถ๋ชจ ์์ ๊ด๊ณ |
๋ชจ๋ธ์ ์ข ๋ฅ | ๋คํธ์ํฌ ๋ชจ๋ธ | ๊ณ์ธต ๋ชจ๋ธ |
์๋ก์ ์งํฉ(Disjoint Sets)
- ๊ณตํต ์์๊ฐ ์๋ ๋ ์งํฉ
- ์๋ก์ ์งํฉ ์๋ฃ๊ตฌ์กฐ: ์๋ก์ ๋ถ๋ถ ์งํฉ๋ค๋ก ๋๋์ด์ง ์์๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ
- ์๋ก์ ์งํฉ ์๋ฃ๊ตฌ์กฐ๋ union๊ณผ find 2๊ฐ์ ์ฐ์ฐ์ผ๋ก ์ํ ์ ์์ด union-find ์๋ฃ๊ตฌ์กฐ๋ผ๊ณ ๋ ๋ถ๋ฆผ
- union(ํฉ์งํฉ): 2๊ฐ์ ์์๊ฐ ํฌํจ๋ ์งํฉ์ ํ๋์ ์งํฉ์ผ๋ก ํฉ์น๋ ์ฐ์ฐ
- find(์ฐพ๊ธฐ): ํน์ ํ ์์๊ฐ ์ํ ์งํฉ์ด ์ด๋ค ์งํฉ์ธ์ง ์๋ ค์ฃผ๋ ์ฐ์ฐ
- ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ์๋ก์ ์งํฉ์ ๊ณ์ฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์
- union ์ฐ์ฐ์ ํ์ธํ์ฌ ์๋ก ์ฐ๊ฒฐ๋ ๋ ๋
ธ๋ A, B๋ฅผ ํ์ธ
- A์ B์ ๋ฃจํธ ๋ ธ๋ A’์ B’๋ฅผ ์ฐพ์
- A’๋ฅผ B’์ ๋ถ๋ชจ ๋ ธ๋๋ก ์ค์ (B' → A')
- ๋ชจ๋ union ์ฐ์ฐ์ ์ฒ๋ฆฌํ ๋๊น์ง 1๋ฒ ๊ณผ์ ๋ฐ๋ณต
- union ์ฐ์ฐ์ ํ์ธํ์ฌ ์๋ก ์ฐ๊ฒฐ๋ ๋ ๋
ธ๋ A, B๋ฅผ ํ์ธ
- ์๋ก์ ์งํฉ์ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์์ ์ฌ์ดํด์ ํ๋ณํ ๋ ์ฌ์ฉ
- ๋ถ๋ชจ ํ ์ด๋ธ์๋ ๋ฃจํธ ๋ ธ๋ ๊ฐ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋ ๋ ธ๋์ฉ ๋น๊ตํ๋ฉด์ ๋ฃจํธ ๋ ธ๋๊ฐ ๊ฐ๋ค๋ฉด ์ฌ์ดํด์ด ๋ฐ์ํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ
- ์๊ฐ ๋ณต์ก๋: O(V+M(1+log(2-M/V) V)) <๋ ธ๋์ ๊ฐ์๊ฐ V๊ฐ์ด๊ณ ์ต๋ V-1๊ฐ์ union ์ฐ์ฐ๊ณผ M๊ฐ์ find ์ฐ์ฐ์ด ๊ฐ๋ฅํ ๋>
์ ์ฅ ํธ๋ฆฌ(Spanning Tree)
- ํ๋์ ๊ทธ๋ํ๊ฐ ์์ ๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ํฌํจํ๋ฉด์ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋ ๋ถ๋ถ ๊ทธ๋ํ
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ(Kruskal Algorithm)
- ์ ์ฅ ํธ๋ฆฌ ์ค ์ต์ ๋น์ฉ์ผ๋ก ๋ง๋ค ์ ์๋ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ฐพ๋ ๊ฒ์ ์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ๋ฉฐ, ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ด ๋ํ์
- ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋น์ฉ์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
- ๊ฐ์ ์ ํ๋์ฉ ํ์ธํ๋ฉฐ ํ์ฌ์ ๊ฐ์ ์ด ์ฌ์ดํด์ ๋ฐ์์ํค๋์ง ํ์ธ
- ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์๋ ๊ฒฝ์ฐ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ํฌํจ
- ์ฌ์ดํด์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ๋ถํฌํจ
- ๋ชจ๋ ๊ฐ์ ์ ๋ํ์ฌ 2๋ฒ ๊ณผ์ ๋ฐ๋ณต
- ๋ชจ๋ ๊ฐ์ ์ ๋ํด ์ ๋ ฌํ ๋ค ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๊ฐ์ ๋ถํฐ ์งํฉ์ ํฌํจ์ํค๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅ๋จ
- ์๊ฐ ๋ณต์ก๋: O(ElogE) <E: ๊ฐ์ ์ ๊ฐ์>
์์ ์ ๋ ฌ(Topology Sort)
- ์์๊ฐ ์ ํด์ ธ ์๋ ์ผ๋ จ์ ์์ ์ ์ฐจ๋ก๋๋ก ์ํํด์ผ ํ ๋ ์ฌ์ฉํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฉํฅ ๊ทธ๋ํ์ ๋ชจ๋ ๋ ธ๋๋ฅผ '๋ฐฉํฅ์ฑ์ ๊ฑฐ์ค๋ฅด์ง ์๋๋ก ์์๋๋ก ๋์ดํ๋ ๊ฒ'
- ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ง์
์ฐจ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋์
- ์ง์ ์ฐจ์:
- ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ์ง์ ์ฐจ์๊ฐ 0์ธ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค
- ํ๊ฐ ๋น๊น์ง ๋ค์์ ๊ณผ์ ๋ฐ๋ณต
- ํ์์ ์์๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์์ ์ถ๋ฐํ๋ ๊ฐ์ ์ ๊ทธ๋ํ์์ ์ ๊ฑฐ
- ์๋กญ๊ฒ ์ง์ ์ฐจ์๊ฐ 0์ด ๋ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค
- ์๊ฐ ๋ณต์ก๋: O(V+E)
๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์
ํ ๊ฒฐ์ฑ
ํ๊ต์์ ํ์๋ค์๊ฒ 0๋ฒ๋ถํฐ N๋ฒ๊น์ง์ ๋ฒํธ๋ฅผ ๋ถ์ฌํ๋ค.
์ฒ์์๋ ๋ชจ๋ ํ์์ด ์๋ก ๋ค๋ฅธ ํ์ผ๋ก ๊ตฌ๋ถ๋์ด, ์ด N+1๊ฐ์ ํ์ด ์กด์ฌํ๋ค.
์ด๋, ์ ์๋์ 'ํ ํฉ์น๊ธฐ' ์ฐ์ฐ๊ณผ '๊ฐ์ ํ ์ฌ๋ถ ํ์ธ' ์ฐ์ฐ์ ์ฌ์ฉํ ์ ์๋ค.
1. 'ํ ํฉ์น๊ธฐ' ์ฐ์ฐ์ ๋ ํ์ ํฉ์น๋ ์ฐ์ฐ์ด๋ค.
2. '๊ฐ์ ํ ์ฌ๋ถ ํ์ธ' ์ฐ์ฐ์ ํน์ ํ ๋ ํ์์ด ๊ฐ์ ํ์ ์ํ๋์ง๋ฅผ ํ์ธํ๋ ์ฐ์ฐ์ด๋ค.
์ ์๋์ด M๊ฐ์ ์ฐ์ฐ์ ์ํํ ์ ์์ ๋, '๊ฐ์ ํ ์ฌ๋ถ ํ์ธ' ์ฐ์ฐ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
'ํ ํฉ์น๊ธฐ' ์ฐ์ฐ์ 0 a bํํ๋ก ์ฃผ์ด์ง๋ฉฐ, '๊ฐ์ ํ ์ฌ๋ถ ํ์ธ' ์ฐ์ฐ์ 1 a b ํํ๋ก ์ฃผ์ด์ง๋ค.
//ํน์ ์์๊ฐ ์ํ ์งํฉ ์ฐพ๊ธฐ
func find_parent(_ parent: [Int], _ x: Int) -> Int{
var parent = parent
if parent[x] != x{
parent[x] = find_parent(parent, parent[x])
}
return parent[x]
}
//๋ ์์๊ฐ ์ํ ์งํฉ ํฉ์น๊ธฐ
func union_parent(_ parent: [Int], _ a: Int, _ b: Int) -> [Int]{
var new_a = find_parent(parent, a)
var new_b = find_parent(parent, b)
var new_parent = parent
if new_a<new_b{
new_parent[new_b] = new_a
}else{
new_parent[new_a] = new_b
}
return new_parent
}
var input_data = readLine()!.split(separator: " ").map{Int(String($0))!}
let n = input_data[0], m = input_data[1]
var parent: [Int] = Array(repeating: 0, count: n+1)
for i in 0...n{
parent[i] = i
}
for i in 0..<m{
input_data = readLine()!.split(separator: " ").map{Int(String($0))!}
var oper = input_data[0], a = input_data[1], b = input_data[2]
if oper == 0{
parent = union_parent(parent, a, b)
}
else if oper == 1{
find_parent(parent, a) == find_parent(parent, b) ? print("YES") : print("NO")
}
}
๋์ ๋ถํ ๊ณํ
๋๋ฌผ์์์ ๋ง ํ์ถํ ์์ญ์ด ํ ๋ง๋ฆฌ๊ฐ ์ธ์์ ๊ตฌ๊ฒฝํ๊ณ ์๋ค.
์ด๋ ๋ ์์ญ์ด๋ 'ํํ๋ก์ด ๋ง์'์ ์ ์ ๋จธ๋ฌผ๋ ๋๋ฐ, ๋ง์นจ ๋ง์ ์ฌ๋๋ค์ ๋๋ก ๊ณต์ฌ ๋ฌธ์ ๋ก ํ์ ์ค์ด์๋ค.
๋ง์์ N๊ฐ์ ์ง๊ณผ ๊ทธ ์ง๋ค์ ์ฐ๊ฒฐํ๋ M๊ฐ์ ๊ธธ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊ธธ์ ์ด๋ ๋ฐฉํฅ์ผ๋ก๋ ์ง ๋ค๋ ์ ์๋ ๊ธธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธธ๋ง๋ค ์ ์งํ๋๋ฐ ๋๋ ์ ์ง๋น๊ฐ ์๋ค.
๋ง์์ ์ด์ฅ์ ๋ง์์ 2๊ฐ์ ๋ถ๋ฆฌ๋ ๋ง์๋ก ๋ถํ ํ ๊ณํ์ ์ธ์ฐ๊ณ ์๋ค. ๋ง์์ด ๋๋ฌด ์ปค์ ํผ์์๋ ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์์ ๋ถํ ํ ๋๋ ๊ฐ ๋ถ๋ฆฌ๋ ๋ง์ ์์ ์ง๋ค์ด ์๋ก ์ฐ๊ฒฐ๋๋๋ก ๋ถํ ํด์ผ ํ๋ค. ๋ง์์๋ ์ง์ด ํ๋ ์ด์ ์์ด์ผ ํ๋ค.
์ผ๋จ ๋ถ๋ฆฌ๋ ๋ ๋ง์ ์ฌ์ด์ ์๋ ๊ธธ๋ค์ ํ์์ ๋ฐ๋ผ ์์จ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ถ๋ฆฌ๋ ๋ง์ ์์์๋ ์์์ ๋ ์ง ์ฌ์ด์ ๊ฒฝ๋ก๊ฐ ํญ์ ์กด์ฌํ๊ฒ ํ๋ฉด์ ๊ธธ์ ์์จ ์ ์๋ค. ๋ง์์ ์ด์ฅ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋๋ก ๊ธธ๋ค์ ์์ ๊ณ ๋๋จธ์ง ๊ธธ์ ์ ์ง๋น์ ํฉ์ผ๋ก ์ต์๋ก ํ๊ณ ์ถ๋ค. ์ด๊ฒ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ์ฒด ๊ทธ๋ํ์์ 2๊ฐ์ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ฐพ์ ํ, ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ์ ์ค์์ ๊ฐ์ฅ ๋น์ฉ์ด ํฐ ๊ฐ์ ์ ์ ๊ฑฐํ๋ค. ๊ทธ๋ฌ๋ฉด ์ต์ ์ ์ฅ ํธ๋ฆฌ๊ฐ 2๊ฐ์ ๋ถ๋ถ ๊ทธ๋ํ๋ก ๋๋์ด์ง๋ฉฐ, ์ต์ ์ ํด๋ฅผ ๋ง์กฑํ๋ค.
//ํน์ ์์๊ฐ ์ํ ์งํฉ์ ์ฐพ๊ธฐ
func find_parent(_ parent: [Int], _ x: Int) -> Int{
var parent = parent
if parent[x] != x{
parent[x] = find_parent(parent, parent[x])
}
return parent[x]
}
//๋ ์์๊ฐ ์ํ ์งํฉ์ ํฉ์น๊ธฐ
func union_parent(_ parent: [Int], _ a: Int, _ b: Int) -> [Int]{
var new_a = find_parent(parent, a)
var new_b = find_parent(parent, b)
var new_parent = parent
if new_a<new_b{
new_parent[new_b] = new_a
}else{
new_parent[new_a] = new_b
}
return new_parent
}
var input_data = readLine()!.split(separator: " ").map{Int(String($0))!}
let n = input_data[0], m = input_data[1]
var parent: [Int] = Array(repeating: 0, count: n+1)
for i in 0...n{
parent[i] = i
}
//๋ชจ๋ ๊ฐ์ ์ ๋ด์ ๋ฐฐ์ด
var edges = [[Int]]()
//์ต์ข
๋น์ฉ์ ๋ด์ ๋ณ์, ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ํฌํจ๋๋ ๊ฐ์ ์ค ๋น์ฉ์ด ๊ฐ์ฅ ํฐ ๊ฐ์
var re: Int = 0, last = 0
for i in 0..<m{
input_data = readLine()!.split(separator: " ").map{Int(String($0))!}
var a = input_data[0], b = input_data[1], cost = input_data[2]
edges.append([cost,a,b])
}
//
edges = edges.sorted{ $0[0] < $1[0] }
for edge in edges {
var cost = edge[0], a = edge[1], b = edge[2]
if find_parent(parent, a) != find_parent(parent, b){
parent = union_parent(parent, a, b)
re += cost
last = cost
}
}
print(re-last)
์ปค๋ฆฌํ๋ผ
๋๋น์ด๋ ์จ๋ผ์ธ์ผ๋ก ์ปดํจํฐ๊ณตํ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์๋ค. ์ด๋ ๊ฐ ์จ๋ผ์ธ ๊ฐ์๋ ์ ์ ๊ฐ์๊ฐ ์์ ์ ์๋๋ฐ, ์ ์ ๊ฐ์๊ฐ ์๋ ๊ฐ์๋ ์ ์ ๊ฐ์๋ฅผ ๋ค์ด์ผ๋ง ํด๋จ ๊ฐ์๋ฅผ ๋ค์ ์ ์๋ค.
๋๋น์ด๋ ์ด N๊ฐ์ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ ํ๋ค. ๋ชจ๋ ๊ฐ์๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง์ ๋ฒํธ๋ฅผ ๊ฐ์ง๋ค. ๋ํ ๋์์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์๋ฅผ ๋ค์ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
๋๋น์ด๊ฐ ๋ฃ๊ณ ์ ํ๋ N๊ฐ์ ๊ฐ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, N๊ฐ์ ๊ฐ์์ ๋ํ์ฌ ์๊ฐํ๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ์ ๊ฐ๊ฐ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ์ ๊ฐ์์ ์ N๊ณผ, ๊ฐ ๊ฐ์์ ๊ฐ์ ์๊ฐ๊ณผ ๊ทธ ๊ฐ์๋ฅผ ๋ฃ๊ธฐ ์ํด ๋จผ์ ๋ค์ด์ผ ํ๋ ๊ฐ์๋ค์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ์ค์ -1๋ก ๋๋๋ค.
//ํ ๊ตฌํ
public struct Queue<T> {
fileprivate var array = [T]()
public var isEmpty: Bool {
return array.isEmpty
}
public var count: Int {
return array.count
}
public mutating func enqueue(_ element: T) {
array.append(element)
}
public mutating func dequeue() -> T? {
if isEmpty {
return nil
} else {
return array.removeFirst()
}
}
public var front: T? {
return array.first
}
}
let n = Int(readLine()!)!
//๋ชจ๋ ๋
ธ๋์ ๋ํ ์ง์
์ฐจ์ 0์ผ๋ก ์ด๊ธฐํ
var indegree: [Int] = Array(repeating: 0, count: n+1)
//๊ฐ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ด๊ธฐ์ํ ๊ทธ๋ํ
var graph: [[Int]] = Array(repeating: Array(repeating: 0, count: 0), count: n+1)
//๊ฐ ๊ฐ์ ์๊ฐ
var time: [Int] = Array(repeating: 0, count: n+1)
//๋ฐฉํฅ ๊ทธ๋ํ์ ๋ณด๋ ๊ฐ์ ์ ๋ณด ์
๋ ฅ๋ฐ๊ธฐ
for i in 1...n{
var data = readLine()!.split(separator: " ").map{Int(String($0))!}
time[i] = data[0]
for x in 1..<data.count-1{
indegree[i] += 1
graph[data[x]].append(i)
}
}
//์์ฐ ์ ๋ ฌ ํจ์
func topology_sort(){
var result = time
var q = Queue<Int>()
//์ฒ์ ์์ํ ๋ ์ง์
์ฐจ์๊ฐ 0์ธ ๋
ธ๋๋ฅผ ํ์ ์ฝ์
for i in 1...n{
if indegree[i] == 0{
q.enqueue(i)
}
}
//ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
while !q.isEmpty{
var now = q.dequeue()!
//ํด๋จ ์์์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ์ง์
์ฐจ์์์ 1 ๋นผ๊ธฐ
for i in graph[now]{
result[i] = max(result[i], result[now]+time[i])
indegree[i] -= 1
if indegree[i] == 0{
q.enqueue(i)
}
}
}
for i in 1...n{
print(result[i])
}
}
topology_sort()
๋ฐ์ํ
'๐ Computer Science > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ต๋จ ๊ฒฝ๋ก(Shortest Path) (0) | 2022.03.31 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming) (0) | 2022.03.30 |
[์๊ณ ๋ฆฌ์ฆ] ์ด์ง ํ์(Binary Search) (0) | 2022.03.25 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(Sorting) (0) | 2022.03.24 |
[์๊ณ ๋ฆฌ์ฆ] DFS/ BFS (0) | 2022.03.23 |