그래프란?, 그래프 탐색 참조
가중치 방향 그래프(weighted directed graph)는 네 가지 main operations을 수행합니다:
addNode
노드 삽입removeNode
노드 삭제addEdge
두 노드 사이에 weighted edge 삽입, 무향 그래프인 경우 양방향 추가removeEdge
두 노드 사이의 weighted edge 삭제, 무향 그래프인 경우 양방향 추가class Node {
constructor(id) {
this.id = id;
this.neighbors = []; // 인접 리스트
}
addNeighbor(node, weight = 1) {
this.neighbors.push({ node, weight });
}
removeNeighbor(node) {
const index = this.neighbors.findIndex(({n}) => n === node);
if (index !== -1) {
this.neighbors.splice(index, 1);
}
}
getNeighbors() {
return this.neighbors.map(({node}) => node);
}
getWeight(node) {
const target = this.neighbors.find(({n}) => n === node);
return target ? target.weight : undefined;
}
}
class Graph {
constructor() {
this.nodes = [];
this.directed = false; // 기본값은 무향 그래프
}
addNode(node) {
this.nodes.push(node);
}
removeNode(node) {
const index = this.nodes.indexOf(node);
if (index !== -1) {
this.nodes.splice(index, 1);
this.nodes.forEach(n => {
n.removeNeighbor(node);
});
}
}
addEdge(node1, node2, weight = 1) {
node1.addNeighbor(node2, weight);
if (!this.directed) { // 무향 그래프인 경우에만 양방향 추가
node2.addNeighbor(node1, weight);
}
}
removeEdge(node1, node2) {
node1.removeNeighbor(node2);
if (!this.directed) { // 무향 그래프인 경우에만 양방향 제거
node2.removeNeighbor(node1);
}
}
}
Node
Graph
function dfs(node, visited = new Set()) {
console.log(node.id);
visited.add(node);
node.neighbors.forEach(({node}) => {
if (!visited.has(node)) {
dfs(node, visited);
}
});
}
Time complexity
Space complexity
function bfs(node) {
const queue = [node];
const visited = new Set();
visited.add(node);
while (queue.length > 0) {
const current = queue.shift();
console.log(current.id);
current.neighbors.forEach(({node}) => {
if (!visited.has(node)) {
visited.add(node);
queue.push(node);
}
});
}
}
Time complexity
Space complexity