[ μλ°μ€ν¬λ¦½νΈ(JavaScript) ] section09 - 1 - κ·Έλνμ μΈμ νλ ¬
π section09 - 1 - κ·Έλνμ μΈμ νλ ¬
μ΄λ² μΉμ
μ κ·Έλνμ νμ(DFS, BFS)
μ λν΄μ λ°°μ΄λ€. μ§κΈμ λ¬Έμ λ₯Ό νμ§ μκ³ κ·Έλνμ λν΄ κ°λ¨νκ² μμ보λ μκ°μ κ°μ Έλ³΄μ. κ·Έλνλ λ€μκ³Ό κ°μ΄ μ΄λ£¨μ΄μ§λ€.
- Vertex: μ μ , λ Έλ
- Edge: λ Έλμ λ Έλλ₯Ό μ°κ²°νλ κ°μ
- graph: 2μ°¨μ λ°°μ΄μμλ
index
κ° μ μ (vertex) λ²νΈλ€.
κ·Έλνμ μ’
λ₯λ 3κ°μ§κ° μλ€. μ
λ ₯μ΄ μ£Όμ΄μ§ λ graph
λ³λ‘ μ΄λ»κ² μ
λ ₯νλμ§ μ½λλ‘ λνλλ€. (μ¬κΈ°μλ μΈμ νλ ¬λ‘ ννν¨)
1. 무방ν₯ κ·Έλν(unDirected Graph): λ°©ν₯μ΄ μλ κ·Έλν μ¦, μλ°©ν₯μΈ κ·Έλνλ€. μ
λ ₯μ λ³΄ν΅ [a, b]
ννλ‘ μ£Όμ΄μ§λλ° μ¬κΈ°μ graph[a][b]=1, graph[b][a]=1
μ λͺ¨λ μννλ€.
// μΈμ νλ ¬
let node = 5;
let edge = 5;
console.log(unDirectedGraph(node, edge));
function unDirectedGraph(node, edge){
let graph = Array.from(Array(node+1), () => Array(edge+1).fill(0));
let input = [[1, 2], [1, 3], [2, 4], [3, 4], [2, 5]];
for (let [a, b] of input){
graph[a][b] = 1;
graph[b][a] = 1;
}
return graph;
}
ππ½ [
[ 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 1, 1, 0, 0 ],
[ 0, 1, 0, 0, 1, 1 ],
[ 0, 1, 0, 0, 1, 0 ],
[ 0, 0, 1, 1, 0, 0 ],
[ 0, 0, 1, 0, 0, 0 ]
]
2. λ°©ν₯ κ·Έλν(directed Graph): λ°©ν₯μ΄ μ ν΄μ Έ μλ κ·Έλνλ€. 무방ν₯ κ·Έλνμλ λ¬λ¦¬ μ μ μ΄ κ°λ¦¬ν€λ λ°©ν₯λ§ graph
μ μ
λ ₯νλ€.
// μΈμ νλ ¬
console.log(directedGraph(node, edge));
function directedGraph(node, edge){
let graph = Array.from(Array(node+1), () => Array(edge+1).fill(0));
let input = [[1, 2], [1, 3], [2, 4], [3, 4], [2, 5]];
for (let [a, b] of input){
graph[a][b] = 1;
}
return graph;
}
ππ½ [
[ 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 1, 1, 0, 0 ],
[ 0, 0, 0, 0, 1, 1 ],
[ 0, 0, 0, 0, 1, 0 ],
[ 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0 ]
]
3. κ°μ€μΉ λ°©ν₯ κ·Έλν(weighted directed Graph): λ°©ν₯ κ·Έλνμ΄λ©΄μ κ°μ€μΉλ κ°μ΄ λνλΈ κ·Έλνμ΄λ€. ν λμμμ λ€λ₯Έ λμλ‘ μ΄λν λ λλ λΉμ©κ³Ό κ°μ λ¬Έμ μμ λ±μ₯νλ€. μ
λ ₯μ a, b, c
λ‘ λ°μ graph[a][b]=c
μ²λΌ λΉμ©κΉμ§ κ°μ΄ graph
μ μ
λ ₯ν΄μΌνλ€.
// μΈμ νλ ¬
console.log(weightedDirectedGraph(node, edge));
function weightedDirectedGraph(node, edge){
let graph = Array.from(Array(node+1), () => Array(edge+1).fill(0));
let input = [[1, 2, 2], [2, 5, 5], [3, 4, 5], [1, 3, 4], [4, 2, 2]];
for (let [a, b, c] of input){
graph[a][b] = c;
}
return graph;
}
ππ½ [
[ 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 2, 4, 0, 0 ],
[ 0, 0, 0, 0, 0, 5 ],
[ 0, 0, 0, 0, 5, 0 ],
[ 0, 0, 2, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0 ]
]
μμμλ μΈμ νλ ¬λ‘ λνλλλ°, κ·Έλνμ κ°μ λνλΌ λλ μΈμ νλ ¬κ³Ό μΈμ 리μ€νΈμ λ°©μμ΄ μλ€. κ°κ°μ νΉμ§μ λ€μκ³Ό κ°λ€.
1. μΈμ νλ ¬(adjacency-matrix): λ
Έλμ κ°μ μ μ 보λ₯Ό νλ ¬λ‘ νννλ λ°©λ², κ°μ μ κ°μμ μκ΄μμ΄ λͺ¨λ μ μ μ ννν΄μΌ νκΈ° λλ¬Έμ μ μ μ κ°μκ° λ§μμλ‘ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λμ΄λλ€. κ°μ€μΉλ₯Ό λ°©ν₯κ·Έλνλ μΈμ νλ ¬λ‘ λνλΈλ€. 무방ν₯, λ°©ν₯μ±κ·Έλν λ¬Έμ λ₯Ό ν λ μ μ μ κ°―μκ° 10,000
μ΄νλΌλ©΄ μΈμ νλ ¬λ‘ νμ.
// graphμ κ°μ μ
λ ₯νλ λ°©λ²
let n = 5;
let m = 9;
let arr = [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 5], [3, 4], [4, 2], [4, 5]];
let graph = Array.from(Array(n+1), () => Array(n+1).fill(0));
// 무방ν₯ κ·Έλν
for (let [a, b] of arr){
graph[a][b]=1;
graph[b][a]=1;
}
// λ°©ν₯ κ·Έλν
for (let [a, b] of arr){
graph[a][b]=1;
}
// κ°μ€μΉ λ°©ν₯ κ·Έλν
let graph = [[1, 2, 2], [2, 5, 5], [3, 4, 5], [1, 3, 4], [4, 2, 2]];
for (let [a, b, c] of arr){
graph[a][b]=c;
}
2. μΈμ 리μ€νΈ(adjacency-list): λ
Έλμ κ°μ μ μ 보λ₯Ό 리μ€νΈ ννλ‘ νννλ λ°©λ², μ°κ²°λ κ°μ λ§ νμνκΈ° λλ¬Έμ μΈμ νλ ¬λ³΄λ€ λΉκ΅μ κ°λ¨νλ€. μ μ μ μμλ κΌ μ€λ¦μ°¨μμ΄ μλμ΄λ μκ΄μλ€. μΈμ 리μ€νΈλ‘ λ¬Έμ λ₯Ό ν λλ μ μ μ κ°μλ§νΌ λ°λ³΅λ¬Έμ λ리λκ²μ΄ μλλΌ κ°μ μ κ°―μ graph[v].length
λ§νΌ λ°λ³΅λ¬Έμ λλ €μΌ μ€ν μλλ₯Ό λμΌ μ μλ€. μΈμ 리μ€νΈμ μλ μ μ μ νμλ‘ ν λ²μ© λ€λ €μΌ νλ μ μ μ΄λ―λ‘ (μλνλ©΄ μ΄λ―Έ μ°κ²°λμ΄μλ μ μ λ§ νμνκΈ° λλ¬Έ) 쑰건문μ graph[v][i]
λ‘ κ°μ νμΈνλ λμ visited
μ¬λΆλ§ νμΈν΄μ£Όλ©΄ λλ€. μ μ μ κ°μκ° 10,000
μ΄μμΌ λλ μΈμ 리μ€νΈλ₯Ό μ¬μ©νμ.
// graphμ κ°μ μ
λ ₯νλ λ°©λ²
let n = 5;
let m = 9;
let arr = [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 5], [3, 4], [4, 2], [4, 5]];
let graph = Array.from(Array(n+1), () => Array());
// λ°©ν₯ κ·Έλν
for (let [a, b] of arr){
graph[a].push(b);
}
console.log(graph)
ππ½ [ [], [ 2, 3, 4 ], [ 1, 3, 5 ], [ 4 ], [ 2, 5 ], [] ]