图的遍历

图的遍历

1462756149

由于一系列的原因,早上我要去找老师给我买票,所以我要去上课!并非出自我本意,本学期的数据结构就上过第一周的2节课,今天是第二次来上的课。

嗯,是的,来了就应该听听,今天讲的是图,说到图的遍历,还提了一下DFS,BFS深度广度搜索法,但是没具体讲,于是,在他讲课的时候我又用DFS,BFS水了一段代码。
问题描述

图的遍历

如图

1.深度优先遍历(DFS)

基本思想:首先从图中某个顶点v0出发,访问此顶点,然后依次从v0相邻的顶点出发深度优先遍历,直至图中所有与v0路径相通的顶点都被访问了;若此时尚有顶点未被访问,则从中选一个顶点作为起始点,重复上述过程,直到所有的顶点都被访问。可以看出深度优先遍历是一个递归的过程。

其深度优先遍历得到的序列为:

0->1->3->7->4->2->5->6

2.广度优先遍历(BFS)

基本思想:首先,从图的某个顶点v0出发,访问了v0之后,依次访问与v0相邻的未被访问的顶点,然后分别从这些顶点出发,广度优先遍历,直至所有的顶点都被访问完。

其广度优先遍历得到的序列为:

0->1->2->3->4->5->6->7

解题思路

遍历,可以采用dfs,bfs,可以使用一个二维数组记录顶点与顶点的关系,例如map[1][2] = 1,map[2][1] = 0, 那就可以表示顶点1->2(1可以通向2,2不能通向1),map[3][4] = 1,map[4][3] = 1,可以表示为3-4,互通。然后再用一个一位数组标记遍历过的顶点。
代码实现

public class Graph {

static final int MAX = 100;
static int[][] map = new int[MAX][MAX];
static int[] vis = new int[MAX];
static int v; // 顶点数

static void dfs(int n) {
    if (n == v)
        return;
    vis[n] = 1; // 标记第n个顶点
    System.out.print(n + "->");
    for (int i = 0; i < v; i++)
        if (map[n][i] == 1 && vis[i] == 0) // 当第i个顶点与n顶点相通,且i顶点未标记则以i顶点继续遍历
            dfs(i);
}

static void bfs() {
    Queue<Integer> queue = new LinkedList<Integer>();
    // 把开始遍历的顶点加入队列并标记
    queue.offer(0);
    vis[0] = 1;
    System.out.print(0);
    while (!queue.isEmpty()) {
        int top = queue.poll();// 出列
        for (int i = 0; i < v; i++)
            if (map[top][i] == 1 && vis[i] == 0) {
                System.out.print("->" + i);
                // 标记入列
                vis[i] = 1;
                queue.offer(i);
            }
    }
}

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    v = scanner.nextInt();
    int i, j;
    // 默认输入为无向图
    while (scanner.hasNext()) {
        i = scanner.nextInt();
        j = scanner.nextInt();
        if (i <= v && j <= v && i >= 0 && j >= 0 && map[i][j] == 0) {
            map[i][j] = 1;
            map[j][i] = 1;
        } else
            break;
    }
    // dfs(0);
    bfs();
    scanner.close();
}

}