Graph(κ·Έλν) βπ»
λ¨λ°©ν₯κ·Έλν(directed graph) : λ€μ΄κ²μ΄μ μ λ¨λ°©ν₯ κ·Έλνμ΄λ€. μμΈμμ λΆμ°μΌλ‘ κ° μ μλ―, λ°λλ‘ λΆμ°μμ μμΈλ‘ κ°λκ²λ κ°λ₯νλ€. νμ§λ§ λ¨λ°©ν₯(directed) κ·Έλνλ‘ κ΅¬νλλ€λ©΄ μμΈμμ λΆμ°μ κ° μ μμ§λ§, λΆμ°μμ μμΈλ‘ κ°λ κ²μ λΆκ°λ₯νλ€(νΉμ κ·Έ λ°λ). λ§μ½ λ μ§μ μ΄ μΌλ°©ν΅ν λλ‘λ‘ μ΄μ΄μ Έ μλ€λ©΄ λ¨λ°©ν₯μΈ κ°μ μΌλ‘ ννν μ μλ€.
μ§μ μ°¨μ(in-degree) / μ§μΆμ°¨μ (out-degree) : ν μ μ μ μ§μ (λ€μ΄μ€λ κ°μ )νκ³ μ§μΆ(λκ°λ κ°μ )νλ κ°μ μ΄ λͺ κ°μΈμ§λ₯Ό λνλΈλ€.
μΈμ (adjacency) : λ μ μ κ°μ κ°μ μ΄ μ§μ μ΄μ΄μ Έ μλ€λ©΄ μ΄ λ μ μ μ μΈμ ν μ μ μ λλ€.
μκΈ° 루ν(self loop) : μ μ μμ μ§μΆνλ κ°μ μ΄ κ³§λ°λ‘ μκΈ° μμ μκ² μ§μ νλ κ²½μ° μκΈ° 루νλ₯Ό κ°μ‘λ€ λΌκ³ νννλ€. λ€λ₯Έ μ μ μ κ±°μΉμ§ μλλ€λ κ²μ΄ νΉμ§
μ¬μ΄ν΄(cycle) : ν μ μ μμ μΆλ°νμ¬ λ€μ ν΄λΉ μ μ μΌλ‘ λμκ° μ μλ€λ©΄ μ¬μ΄ν΄μ΄ μλ€κ³ νννλ€.
λ΄λΉκ²μ΄μ
κ·Έλνλ μμΈ -> λμ -> λΆμ° -> μμΈ
λ‘ μ΄λμ΄ κ°λ₯νλ―λ‘, μ¬μ΄ν΄μ΄ μ‘΄μ¬νλ κ·Έλν μ΄λ€.
// directed graph (λ°©ν₯ κ·Έλν)
// unweighted (λΉκ°μ€μΉ)
// adjacency matrix (μΈμ νλ ¬)
// μ΄ν΄λ₯Ό λκΈ° μν΄ κΈ°μ‘΄ λ°°μ΄μ μΈλ±μ€λ₯Ό μ μ μΌλ‘ μ¬μ©ν©λλ€ (0, 1, 2, ... --> μ μ )
class GraphWithAdjacencyMatrix {
constructor() {
this.matrix = [];
}
addVertex() {
//λ²ν
μ€λ₯Ό μΆκ°ν©λλ€.
const currentLength = this.matrix.length;
for (let i = 0; i < currentLength; i++) {
this.matrix[i].push(0);
}
this.matrix.push(new Array(currentLength + 1).fill(0));
}
contains(vertex) {
//TODO: λ²ν
μ€(μΈλ±μ€)κ° μλμ§ νμΈν©λλ€.
if(0 <= vertex && vertex < this.matrix.length){
return true;
}
return false;
}
addEdge(from, to) {
const currentLength = this.matrix.length;
if (from === undefined || to === undefined) {
console.log("2κ°μ μΈμκ° μμ΄μΌ ν©λλ€.");
return;
}
//TODO: κ°μ μ μΆκ°ν μ μλ μν©μμλ μΆκ°νμ§ λ§μμΌ ν©λλ€.
if (from + 1 > currentLength || to + 1 > currentLength || from < 0 || to < 0) {
console.log("λ²μκ° λ§€νΈλ¦μ€ λ°μ μμ΅λλ€.");
return;
}
//TODO: κ°μ μ μΆκ°ν΄μΌ ν©λλ€.
this.matrix[from][to] = 1;
}
hasEdge(from, to) {
//TODO: λ λ²ν
μ€ μ¬μ΄μ κ°μ μ΄ μλμ§ νμΈν©λλ€.
if(this.matrix[from][to] === 1){
return true;
}
return false;
}
removeEdge(from, to) { //μ£μ§ μ κ±°
const currentLength = this.matrix.length;
if (from === undefined || to === undefined) {
console.log("2κ°μ μΈμκ° μμ΄μΌ ν©λλ€.");
return;
}
//TODO: κ°μ μ μ§μΈ μ μλ μν©μμλ μ§μ°μ§ λ§μμΌ ν©λλ€.
if (from + 1 > currentLength || to + 1 > currentLength || from < 0 || to < 0) { //from, to λ²μκ° λμ΄μλ κ²½μ° κ°μ μ μ§μΈ μ μλ€.
return;
}
//TODO: κ°μ μ μ§μμΌ ν©λλ€.
this.matrix[from][to] = 0;
}
}