断开连接的图上的DFS

时间:2017-01-25 05:56:18

标签: algorithm graph graph-algorithm depth-first-search

DFS(G,v)如何处理断开连接的图形?

假设一个图形有3个连通的组件,并且DFS应用于这3个Connected组件之一,那么我们是访问每个组件还是只访问其顶点DFS应用的on。

意味着说

是否正确
  

具有许多组件的图表上的DFS仅涵盖1个组件。

我还尝试了用于断开连接的图形的在线DFS可视化工具,并且它们还支持它仅涵盖1个组件。但我仍然要确认

2 个答案:

答案 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"));