andruhovski icon

Graph

andruhovski | PRO | 01/18/17 11:08:17 AM UTC | 0 ⭐ | 939 👁️ | Never ⏰ | []
JavaScript |

3.46 KB

|

None

|

0 👍

/

0 👎

"use strict";
class Queue {
    constructor() {
        this.dataStore = [];
    }
 
    enqueue (element) {
        this.dataStore.push(element);
    };
 
    dequeue () {
        return this.dataStore.shift();
    };
 
    front () {
        return this.dataStore[0];
    };
 
    back () {
        return this.dataStore[this.dataStore.length - 1];
    };
 
    toString() {
        return this.dataStore.join("\n");
    };
 
    isEmpty (){
            return this.dataStore.length == 0;
    }
}
 
 
class Graph {
    constructor() {
        this.vertices = [];
        this.edges = new Map();
    };
 
    addVertex(vertex) {
        this.vertices.push(vertex);
        this.edges.set(vertex, []);
    };
 
    addEdge(vertexFrom, vertexTo) {
        if (this.edges.has(vertexFrom) && this.edges.has(vertexTo)) {
            this.edges.get(vertexFrom).push(vertexTo);
            this.edges.get(vertexTo).push(vertexFrom);
        }
    };
 
    removeVertex(vertex) {
        // remove edges
        for (let vert in this.edges.get(vertex)) {
            this.removeEdge(vert, vertex);
        }
        this.edges.delete(vertex);
        // remove vertex
        let index = this.vertices.indexOf(vertex);
        this.vertices.splice(index, 1);
    };
 
    removeEdge(vertexFrom, vertexTo) {
        if ((this.edges.has(vertexFrom)) && (this.edges.has(vertexTo))) {
            let index;
 
            index = this.edges.get(vertexFrom).indexOf(vertexTo);
            this.edges.get(vertexFrom).splice(index, 1);
 
            index = this.edges.get(vertexTo).indexOf(vertexFrom);
            this.edges.get[vertexTo].splice(index, 1);
        }
    };
 
    bfs(v, action) {
        let colors = new Map();
        this.vertices.forEach(item => colors.set(item, "white"));
 
        var queue = new Queue();
        queue.enqueue(v);
        while (!queue.isEmpty()) {
            var vertex = queue.dequeue();
            // додати всі білі вершини до черги і позначити їх сірими
            let neighbours = this.edges.get(vertex);
            for (let index in neighbours) {
                if (colors.find(neighbours[index]) === "white") {
                    queue.enqueue(neighbours[index]);
                    colors.set(neighbours[index], "grey");
                }
            }
            // обробити вершину
            action(vertex);
            // позначити вершину чорною
            colors.set(vertex, "black");
        }
    }
 
    // for debug purposes
    printData() {
        console.log("Vertices -------------------");
        console.log(this.vertices.join());
 
        console.log("Edges ----------------------");
        this.edges.forEach((value, key) => console.log(key + "--->" + value.join()));
    }
}
 
const graph = new Graph();
graph.addVertex("1");
graph.addVertex("2");
graph.addVertex("3");
graph.addVertex("4");
graph.addVertex("5");
graph.addVertex("6");
graph.addVertex("7");
graph.addVertex("8");
graph.addVertex("9");
graph.printData();
 
graph.addEdge("1", "2");
graph.addEdge("1", "7");
graph.addEdge("1", "8");
 
graph.addEdge("2", "3");
graph.addEdge("2", "6");
 
graph.addEdge("3", "4");
graph.addEdge("3", "5");
 
graph.addEdge("8", "9");
graph.addEdge("8", "12");
 
graph.addEdge("9", "10");
graph.addEdge("9", "11");
graph.printData();
graph.removeEdge("9", "11");
 
graph.printData();

Comments