DFS(G,v)如何处理断开连接的图形?
假设一个图形有3个连通的组件,并且DFS应用于这3个Connected组件之一,那么我们是访问每个组件还是只访问其顶点DFS应用的on。
意味着说
是否正确具有许多组件的图表上的DFS仅涵盖1个组件。
我还尝试了用于断开连接的图形的在线DFS可视化工具,并且它们还支持它仅涵盖1个组件。但我仍然要确认
答案 0 :(得分:3)
开始搜索断开连接的图形的单个组件将仅搜索该组件;怎么会这样呢?没有信息可以决定何时,如何或在何处将搜索移动到其他组件。
如果要对断开连接的图表执行完整搜索,则有两个高级选项:
请注意,同样的推理也适用于广度优先搜索。
答案 1 :(得分:0)
我提出了一种de DFS可以搜索图表中被删除部分的方法,我不知道它是否是最好的,但现在在下面。
function Node(id, val){
this.id = id;
this.val = val;
this.nodeChildren = {};
}
Node.prototype.addAssociation = function(node){
this.nodeChildren[node.val] = node;
}
function Graph(){
this.nodes = [];
this.countNodes = 0;
}
Graph.prototype.addNode = function(val){
var n = new Node(this.countNodes, val);
this.nodes.push(n);
this.countNodes++;
return n;
}
Graph.prototype.search = function(val){
var nodeIndex = 0;
var visited = {}; //Hashmap
var found = null;
//Loop within the nodes and check if we didn't found a result yet
while(nodeIndex < this.nodes.length && found ==null ){
if(nodeIndex == this.nodes.length) return null;
var currentNode = this.nodes[nodeIndex];
nodeIndex++;
console.log("searching from", currentNode.val, visited);
found = this.searchDFS(val, visited, currentNode);
}
return found;
}
Graph.prototype.searchDFS = function(val, visited, currentNode){
//Node already visited skip
if(visited[currentNode.id] ==1 ) {
console.log("already visited, skipping");
return null;
}
//Found the node return it
if(currentNode.val == val){
return currentNode;
}
visited[currentNode.id] = 1;
var keys = Object.keys(currentNode.nodeChildren);
for(var i=0; i<keys.length; i++){
var childNode = currentNode.nodeChildren[keys[i]];
if(visited != 1){
return this.searchDFS(val, visited, childNode);
}
}
}
var g = new Graph();
var n1 = g.addNode("a");
var n2 = g.addNode("b");
var n3 = g.addNode("c");
g.addNode("c1").addAssociation(n3);
g.addNode("c2").addAssociation(n2);
var n4 = g.addNode("d");
var n5 = g.addNode("e");
n1.addAssociation(n2);
n1.addAssociation(n3);
n2.addAssociation(n3);
n3.addAssociation(n4);
console.log("found", g.search("e"));