图的遍历——深度优先遍历问题

74DPBAIMC_BM})SFTTM)5DK.png
  • 从这道题来看,深度优先搜索遍历这个图:首先从没有走到过的顶点作为起始点,假如从1开始作为起始点,与1相连接的有顶点2.3.5,那么首先尝试访问顶点2,与2相连的顶点且没有访问过的只有顶点4,那么接下来访问顶点4,可是定点4没有未访问过的顶点,所以返回顶点2,顶点2也没没有未访问过的顶点则返回顶点1,与顶点1相连且没有被访问过的有顶点3.5那么就可以访问顶点3,顶点3也没有未访问过的顶点所以返回顶点1,只有顶点5没有被访问过所以访问顶点5,这样就遍历完了整个图,顺序为12435。
  • 时间戳:这个顶点是被第几个访问到的。
  • 深度优先遍历的主要思想:首先以一个未被访问过的顶点作为起始点v,依次从未访问的邻接点出发对图进行遍历,直到图中和v相连的顶点都被访问到,若图中有未被访问的则从一个未被访问的顶点出发重新进行遍历。


    QQ截图20190315202807.png

    上图二维数组中的第i行的第j列表示的就是顶点i到顶点j是否有边,1表示有,∞表示没有。

  • 用c代码完成遍历:
#include <stdio.h>
    int book[100];//数组book用来记录哪些顶点已经访问过
    int sum;//用来记录已经访问过多少个顶点
    int n;//变量n存储的是图的顶点的总个数
    int e[100][100];//二维数组e存储的就是图的边(邻接矩阵)
int main(){
    int i,j,m,a,b;//i,j是二维矩阵的行和列,m是边数,a和b分别代表两个顶点
    scanf("%d %d",&n,&m);
    //初始化二维矩阵
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i==j)
                e[i][j]=0;//自己到自己设为0,即为对角线
            else
                e[i][j]=999999;//将999999设为正无穷,正无穷表示两个点之间没有边

    //读入顶点之间的边
    for(i=1;i<=m;i++){
        scanf("%d %d",&a,&b);
        e[a][b]=1;//代表这两个点之间有边
        e[b][a]=1;//因为是无向图,所以需要将e[b][a]也赋为1
    }

    //从1号定点出发
    book[1]=1;//标记1号顶点已访问
    dfs(1);//从1号顶点开始遍历

    getchar();getchar();
    return 0;
}
void dfs(int cur)//cur是当前所在的定点编号(当前正在遍历的顶点)
{
    int i;
    printf("%d ",cur);
    sum++;//每访问一个顶点,sum就加1
    if(sum==n)//所有顶点都已经访问过则直接退出
        return;
    for(i=1;i<=n;i++){//从1号顶点到n号顶点依次尝试,看哪些顶点与当前顶点cur有边相连
        //判断当前顶点cur到顶点i是否有边,并判断顶点i是否已经访问过
        if(e[cur][i]==1&&book[i]==0){//等于1 代表有边,等于0代表没有被访问过
                book[i]=1;//标记顶点i被访问过
                dfs(i);//从顶点i再出发继续遍历
        }

    }
    return;
}

验证时输入:
5 5
1 2
1 3
1 5
2 4
3 5
结果为
1 2 4 3 5

  • 用Java代码完成遍历:
import java.util.Scanner;

public class DFS {
    static int[] book = new int[100];
    static int sum = 0;
    static int n;
    static int m;
    static int[][] e = new int[100][100];
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        n = sc.nextInt();
        m = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (i == j) {
                    e[i][j] = 0;
                } else {
                    e[i][j] = 999999;
                }
            }
        }
        for (int i = 1; i <= m; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            e[a][b] = 1;
            e[b][a] = 1;
        }
        book[1] = 1;
        dfs(1);

    }

    public static void dfs(int cur) {
        System.out.println(cur + " ");
        sum++;
        if (sum == n) {
            return;
        }
        for (int i = 1; i <= n; i++) {
            if (e[cur][i] == 1 && book[i] == 0) {
                book[i] = 1;
                dfs(i);
            }
        }
        return;
    }
}

特别注意的是:在输入n 和m的时候,不能加int
int n = sc.nextInt();是错的
int m = sc.nextInt();是错的
以上只是一个简单的深度优先搜索例子。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容