广度优先算法

广度优先算法核心思想

需求: 以上是一张图,求1号节点到5号节点最少需要经过几个节点。

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

分析:
首先我们从1号顶点开始出发,访问其可以到达的顶点2,将其入队,接着访问其可以到达的顶点3,将其入队。此时1号顶点已经没有可以到达的未访问过的节点,接着我们就从2号顶点开始访问其未访问过的顶点,以此类推,直到队列中出现最后的顶点(4号顶点),此时遍历结束。

总结: 广度优先算法的核心思想就是:从一个未被访问过的顶点开始,访问该顶点所有相邻的顶点,然后对每个相邻的顶点再访问他们相邻的未被访问的顶点,直到所有的顶点都被访问过,遍历结束。

代码实现:


int[][] arrs = new int[5][5];
int end = 4; //设置最终要到达的元素
int head = 0;
int tail = 1;
int[] que = new int[25];
int[] book = new int[5];
boolean flag = false;

private void initArrs() {
    for (int i = 0; i <= 4; i++) {
        for (int j = 0; j <= 4; j++) {
            arrs[i][j] = 0;
        }
    }

    arrs[0][1] = 1;
    arrs[0][2] = 1;

    arrs[1][0] = 1;
    arrs[1][2] = 1;
    arrs[1][3] = 1;

    arrs[2][0] = 1;
    arrs[2][1] = 1;
    arrs[2][3] = 1;
    arrs[2][4] = 1;

    arrs[3][1] = 1;
    arrs[3][2] = 1;
    arrs[3][4] = 1;

    arrs[4][2] = 1;
    arrs[4][3] = 1;
}

private void wfs() {
    while (head < tail && tail <= end) {
        for (int i = 0; i <= 4; i++) {
            if (arrs[head][i] == 1 && book[i] == 0) {
                que[tail++] = i;
                book[i] = 1;
            }

            if (tail > end) {
                flag = true;
                break;
            }
        }

        if (flag) {
            break;
        }

        head++;
    }
}

@Test
public void testWidthSearch() {
    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;
    que[0] = 0;
    wfs();

    for (int i = 0; i <= 4; i++) {
        System.out.println(que[i]);
    }

    System.out.println(head);
}
posted @ 2017-11-04 20:29  Arthur_08320  阅读(544)  评论(0编辑  收藏  举报