/js@mmis_js_bot function Dictonary(){
var items = {};
this.has = function(key){
return key in items;
};
this.set = function(key, value){
items[key] = value;
};
this.size = function(key, value){
items[key] = value;
return value;
};
this.get = function(key){
return this.has(key) ? items[key] : undefined;
};
this.values = function(){
var values = {};
for (var k in items){
if (this.has(k)){
values.push(items[k]);
}
}
};
this.getItems = function(){
return items;
};
this.keys = function() {
return Object.keys(items);
};
this.size = function() {
var count = 0;
for(var prop in items) {
if(items.hasOwnProperty(prop)) {
++count;
}
return count;
}
};
}
function Graph(){
var vertives =[];
var adjList = new Dictonary();
this.addVertex = function(v){
vertives.push(v);
adjList.set(v, []);
};
this.addEdge = function(v, w){
adjList.get(v).push(w);
adjList.get(w).push(v);
};
this.toString = function(){
var s = '';
for (var i = 0; i < vertives.length; i ++){
s += vertives[i] + ' -> ';
var neighbors = adjList.get(vertives[i]);
for (var j = 0; j < neighbors.length; j ++){
s += neighbors[j] + ' ';
}
s += '\n';
}
return s;
};
var Breadthfirst = function(){
var color = [];
for (var i = 0; i < vertives.length; i ++){
color[vertives[i]] = 'white';
}
return color;
};
this.dfs = function(callback){
var color = Breadthfirst();
for(var i = 0; i < vertives.length; i ++){
if(color[vertives[i]] === 'white'){
dfsVisit(vertives[i], color, callback);
}
}
};
var dfsVisit = function(u, color, callback){
color[u] = 'grey';
if(callback){
callback(u);
}
var neighbors = adjList.get(u);
for (var i = 0; i < neighbors.length; i ++){
var w = neighbors[i];
if(color[w] === 'white'){
dfsVisit(w, color, callback);
}
}
color[u] = 'black';
};
}
var graph = new Graph();
var list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'];
for (var i = 0; i < list.length; i ++){
graph.addVertex(list[i]);
}
graph.addEdge('A', 'B');
graph.addEdge('A', 'C');
graph.addEdge('A', 'D');
graph.addEdge('A', 'E');
graph.addEdge('B', 'G');
graph.addEdge('C', 'F');
graph.addEdge('D', 'I');
graph.addEdge('F', 'H');
graph.addEdge('F', 'I');
graph.addEdge('G', 'H');
console.log(graph.toString());
function print(value){
console.log('Print ' + value);
}
graph.dfs(print);