当前位置: 首页 > 知识库问答 >
问题:

DFS查找所有可能的路径

朱兴学
2023-03-14

我有以下Java代码,可以在图中找到从一个节点到另一个节点的路径,如何修改它,以便显示所有可能的路径。这里只显示了一条路径,它是一个循环?

输出:路径:[1、2、3、4、1]

对于节点1和4之间的路径,正确的输出应该是:

第一条路径:1-

第二条路径:1-

代码:

import java.util.Iterator;
import java.util.Set;
import java.util.Stack;
import java.util.TreeSet;
import java.util.List;
import java.util.ArrayList;

public class Graph {

    Stack<Integer> pilha = new Stack<Integer>();


    private int numVertex;
    private boolean[][] adj;

    public Graph(int numVertex, int numEdges) {
        this.numVertex = numVertex;
        this.adj = new boolean[numVertex][numVertex];
    }

    public void addEdge(int start, int end){
        adj[start-1][end-1] = true;
        adj[end-1][start-1] = true;
    }

    List<Integer> visited = new ArrayList<Integer>();
    public void DFS(Graph G, int startVertex){
        int i=0;
        pilha.push(startVertex);

        while (!pilha.empty()) {
            int v = pilha.peek();
            Boolean hasNeighbor = false;
            for (i = 1; i <= G.numVertex; i++) {
                if(G.adj[i-1][v-1] != false) {
                    hasNeighbor = true;
                    pilha.push(i);
                    G.adj[i-1][v-1] = false;
                    G.adj[v-1][i-1] = false;
                    break;
                }
            }
            if (!hasNeighbor) {
                visited.add(0, pilha.pop());
            }
        }
        System.out.println("Path: " + visited);
    }



    public static void main(String[] args) {
        Graph g = new Graph(4, 4);
        g.addEdge(1, 2);
        g.addEdge(2, 3);
        g.addEdge(1, 3);
        g.addEdge(3, 4);
        g.DFS(g, 1);    
    }
}

共有1个答案

昝欣可
2023-03-14

在您的代码中,您没有提到目的地,这是查找源和目的地之间所有可能路径的解决方案。

import java.util.ArrayList;

导入java。util。列表

公共类DepthFirstSearch{

// recursive dfs
private static void dfs_rec(ArrayList<ArrayList<Integer>> adjLists, boolean[] visited, int v, int d,
        List<Integer> path) {
    visited[v] = true;
    path.add(v);

    if (v == d) {

        for (int i = 0; i < path.size(); i++) {
            System.out.print(path.get(i));
        }
        System.out.println("");
    }

    else {
        for (int w : adjLists.get(v)) {
            if (!visited[w]) {
                dfs_rec(adjLists, visited, w, d, path);
            }

        }
    }
    path.remove(path.size() - 1);
    visited[v] = false;
}

// Usually dfs_rec() would be sufficient. However, if we don't want to pass
// a boolean array to our function, we can use another function dfs().
// We only have to pass the adjacency list and the source node to dfs(),
// as opposed to dfs_rec(), where we have to pass the boolean array
// additionally.
public static void dfs(ArrayList<ArrayList<Integer>> adjLists, int s, int d) {
    int n = adjLists.size();
    boolean[] visited = new boolean[n];

    List<Integer> path = new ArrayList<Integer>();
    int path_index = 0; // Initialize path[] as empty
    dfs_rec(adjLists, visited, s, d, path);
}

// ----------------------------------------------------------------------
// Testing our implementation
public static void main(String[] args) {

    // Create adjacency list representation
    ArrayList<ArrayList<Integer>> adjLists = new ArrayList<ArrayList<Integer>>();
    final int n = 7;

    // Add an empty adjacency list for each vertex
    for (int v = 0; v < n; v++) {
        adjLists.add(new ArrayList<Integer>());
    }

    // insert neighbors of vertex 0 into adjacency list for vertex 0
    adjLists.get(0).add(1);
    adjLists.get(0).add(2);
    adjLists.get(0).add(3);

    // insert neighbors of vertex 1 into adjacency list for vertex 1
    adjLists.get(1).add(5);
    adjLists.get(1).add(6);

    // insert neighbors of vertex 2 into adjacency list for vertex 2
    adjLists.get(2).add(4);

    // insert neighbors of vertex 3 into adjacency list for vertex 3
    adjLists.get(3).add(2);
    adjLists.get(3).add(4);

    // insert neighbors of vertex 4 into adjacency list for vertex 4
    adjLists.get(4).add(1);

    // insert neighbors of vertex 5 into adjacency list for vertex 5
    // -> nothing to do since vertex 5 has no neighbors

    // insert neighbors of vertex 6 into adjacency list for vertex 5
    adjLists.get(6).add(4);

    // Print vertices in the order in which they are visited by dfs()
    dfs(adjLists, 0, 4);

}

}

 类似资料:
  • 问题内容: 早上好! 我正在开发一种算法,以查找无向图而不是加权图中的所有路径。我目前正在使用具有回溯功能的DFS算法来尝试执行此操作。这是我当前的代码: 该程序在其输入上接收整数。第一个是节点数,第二个是链接数,第三个是开始节点和结束音,它们是相同的。之后的所有整数表示节点之间的连接。 问题在于,该算法仅查找一次访问单个节点的所有路径。我想要的是仅查找一次访问每个连接的所有路径的算法。关于我该怎

  • 我正在尝试编写一个递归方法,它可以找到一个路径,而不需要回溯到一个int矩阵中的一个位置,这个矩阵包含值0,1。0可以踩,1不行。我也限制了一条超过50步的路径。 Location是一个具有行和列值(x,y)的对象。locationEquals是一个函数,如果两个位置相同,则返回true,否则返回false。map变量是我试图在其中找到路径的矩阵。 执行以下代码后'选项'为空,这意味着它没有找到方

  • 问题内容: 当我尝试做这样的事情时,我意识到我真的需要上大学! 无论如何,我都有一个字符串数组(275),我需要遍历它们并用Java创建所有可能对的字符串。 我一直在学习递归,但是我找不到答案。 问题答案: 如果对和不同,请执行以下操作: 如果没有,请执行以下操作: 请注意,我假设数组包含唯一的字符串!

  • 下面的函数打印所有的子路径。是否可以只显示完整的路径,即A->B->C(包含以下所需的输出)。

  • 我试图打印二叉树的所有路径(根到叶的路径),但没有效果。 我的策略是使用递归,基本情况是树为None或树节点为leaf return,否则,遍历树的左侧和右侧。 但我找不到同时保留左右树的方法。

  • 我有一个有向加权图G,其中权重是过渡的持续时间。 我使用DFS编写了两个顶点之间的所有路径搜索算法,并进行了修改:搜索将继续,直到路径的总权重(其各部分的权重之和)小于某个值。 我的代码在小图中工作,但在大图中(| V |=1800,| E |=50870)它会冻结。