深度优先算法

深度优先算法核心思想

需求: 以上是一张图,求1号节点到5号节点的最短路径。

节点之间有边则可以走,如果没有则不能,例如:从1号节点可以到2号节点,路径为2。从1号节点不能直接到3号节点

分析:
为了求得最短路径,我们需要将所有从1号顶点到5号节点的可能情况遍历一遍。首先我们从1号顶点开始尝试访问未走到过的顶点,此时发现2号顶点没有走过,于是来到了2号顶点。再从2号顶点开始尝试访问未走到过的顶点,此时发现3号顶点没有走过,于是来到了3号顶点。以此类推最后可以到达5号顶点,此时完成一次遍历切将路径长度(14)记录下来。接着我们需要返回到4号顶点,从4号顶点接着尝试未被访问过的顶点,此时需要退回到3号顶点,以此类推,当我们退回到2号顶点,接着尝试未被访问过的顶点,尝试访问4号顶点,此时发现无法从2号顶点走到4号顶点,所以回退到2号顶点,接着尝试5号顶点,发现可以到达,此时又完成一次遍历,将路径长度(9)记录下来。以此类推,直到尝试过所有顶点。

总结: 深度优先算法的核心思想就是:从一个未被访问过的顶点开始,沿当前顶点边走到未被访问过的顶点,当没有未被访问过的顶点时,则返回上一个顶点,继续试探访问别的顶点,直到所有顶点都被访问过。

深度优先算法基本模型

  void dfs (int step) {
   判断边界
   尝试每一种可能 for (int i > = 0; i <= n; i++) {  
   继续下一步 dfs(step + 1);
  }
}

代码实现:


int[][] arrs = new int[5][5];
int top = 4; //最后要到达的顶点为4号顶点
int minDistance = 999; //初始化最小路径
int[] book = new int[5]; //用于记录已经走过的节点

/**
 * 初始化数组
 *
 */
private void initArrs() {

    for (int i = 0; i <= 4; i++) {
        for (int j = 0; j <= 4; j++) {

            //每个顶点不能自己到达自己,例如从1号顶点到1号定点的路径为0
            if (i == j) {
                arrs[i][j] = 0;
                continue;
            }

            //设置0号定点可以到达的点以及路径,如果不能到达则路径为999
            if (i == 0) {
                if (j == 1) {
                    arrs[i][j] = 2;
                } else if (j == 4) {
                    arrs[i][j] = 10;
                } else {
                    arrs[i][j] =999;
                }
            }

            //设置1号定点可以到达的点以及路径,如果不能到达则路径为999
            if (i == 1) {
                if (j == 2) {
                    arrs[i][j] = 3;
                } else if (j == 4) {
                    arrs[i][j] = 7;
                } else {
                    arrs[i][j] =999;
                }
            }

            //设置2号定点可以到达的点以及路径,如果不能到达则路径为999
            if (i == 2) {
                if (j == 0) {
                    arrs[i][j] = 4;
                } else if (j == 3) {
                    arrs[i][j] = 4;
                } else {
                    arrs[i][j] =999;
                }
            }

            //设置3号定点可以到达的点以及路径,如果不能到达则路径为999
            if (i == 3) {
                if (j == 4) {
                    arrs[i][j] = 5;
                } else {
                    arrs[i][j] =999;
                }
            }

            //设置4号定点可以到达的点以及路径,如果不能到达则路径为999
            if (i == 4) {
                if (j == 2) {
                    arrs[i][j] = 3;
                } else {
                    arrs[i][j] =999;
                }
            }
        }

    }
}

/**
 * 算法核心
 * @param currentNode
 * @param distance
 */
private void dfs(int currentNode, int distance) {

    if (distance > minDistance) {
        return;
    }

    if (currentNode == top) {
        if (distance < minDistance) {
            minDistance = distance;
        }

        //输出走过的路径
        for (int i = 0; i <= 4; i++) {
            if (book[i] == 1) {
                System.out.print(i + " ");
            }
        }
        System.out.println();

        return;
    }

    for (int i = 0; i <= 4; i++) {
        if (arrs[currentNode][i] != 999 && arrs[currentNode][i] != 0 && book[i] == 0) {
            book[i] = 1;
            dfs(i, distance + arrs[currentNode][i]);
            book[i] = 0;
        }
    }
}

@Test
public void testDeepSearch() {
    initArrs();
    for (int i = 0; i <= 4; i++) {
        for (int j = 0; j <= 4; j++) {
            System.out.print(arrs[i][j]+"      ");
        }
        System.out.println("");
    }
    book[0] = 1;
    dfs(0, 0);
    System.out.println(minDistance);
}
posted @ 2017-11-04 16:28  Arthur_08320  阅读(908)  评论(0编辑  收藏  举报