【数据结构】图形结构——图的遍历
创始人
2024-03-06 07:09:14
0

图的遍历是从某个顶点出发,对图中所有顶点仅访问一次。若给定的图是连通的,则从图的任一顶点出发沿着边可以访问到该图的所有顶点。然而,图的遍历比树的遍历复杂很多,这是因为图中的任一顶点都可能和其余顶点相邻接,故在访问了某个顶点之后,可能沿着某条回路又回到了该顶点。为了避免重复访问同一个顶点,必须记住每个顶点是否被访问过。

目录

1.深度优先搜索遍历

1. 邻接矩阵

2. 邻接表 

2.广度优先搜索遍历


1.深度优先搜索遍历

(1)深度优先搜索遍历类似树的先根遍历。假设给定图G初态是所有顶点均未曾访问过,在图中任选一个顶点Vi为初始出发点,则深度优先搜索可定义为,首先访问出发点Vi,从Vi的每一个未被访问过的邻接点出发,深度优先搜索图G,直至图G中所有与Vi相通的顶点都被访问过,若图中还有未被访问的顶点,选择一个未被访问的顶点作为出发点,继续深度优先搜索。

(2)图的深度优先搜索是一个递归的过程。对于一个连通的图来说,从任一个顶点出发,执行一次深度优先搜索可以遍历图中所有顶点;而对于非连通的图来说,需要进行多次深度优先搜索才可以遍历图中所有顶点。

(3)遍历过程中,为了区分顶点是否被访问过,需要设置一个访问标志数组visit[],若顶点i未被访问,则visit[i]为0,否则visit[i]为1。

1. 邻接矩阵

int visit[N];                     //定义辅助数组记录顶点的访问状态 
void DFS(int i,MGraph *g){
    int j;
    printf("%c",g->vexs[i]);
    visit[i]=1;
    for(j=0;jvexnum;j++)
        if((g->arcs[i][j]==1)&&(!visit[j]))
            DFS(j,g);

void TDFS(MGraph *g){            //深度优先遍历整个图算法 
    int i;
    for(i=0;ivexnum;i++)
        if(visit[i]!=1)
            DFS(i,g);
}

2. 邻接表 

void DFSL(int i,ALGraph *g){
    int j;
    EdgeNode *p;
    printf("%c",g->adjlist[i].data);
    visit[i]=1;
    p=g->adjlist[i].link;
    while(p){
        j=p->adjvex;
        if((!visit[j])){
            DFSL(j,g);
        }
        p=p->next;
    }
}
void TDFSL(ALGraph *g){
    int i;
    for(i=0;ivexnum;i++){
        if(visit[i]==0){
            DFSL(i,g);
        }
    }
}

2.广度优先搜索遍历

(1)广度优先搜索遍历类似于树的按层次遍历。设图G的初始状态是所有顶点均未访问过,在G中任选一顶点Vi为初始出发点,则广度优先搜索的基本思想是,首先访问出发点Vi,接着依次访问Vi的所有邻接点W1,W2,W3,…,Wt;然后,再依次访问与W1,W2,…,Wt邻接的所有未曾访问的顶点,直至图G中所有与Vi相通的顶点都被访问;若图中还有未被访问的顶点,选择一个未被访问的顶点作为出发点,继续广度优先搜索

(2)广度搜索过程是一种基于层次遍历的搜索过程,类似于二叉树的层次遍历,以某个顶点为出发点,访问其所有未被访问邻接点,下一步的搜索是以刚刚被访问过的顶点为出发点继续广度搜索,而上一层刚被访问的顶点可能不止一个,需要暂存这些顶点,且下次访问要保证这些顶点的先后访问次序,因此广度优先搜索需要借助队列来暂存那些刚被访问过的顶点。广度优先搜索不需要回溯,不是递归过程。

(3)广度优先遍历算法如下:

int visited[N];
void BFS(int k,MGraph *g){
    int i,j;
    SqQueue qlist,*q;
    q=&qlist;
    q->rear=0;
    q->front=0;
    printf("%c",g->vexs[k]);
    visited[k]=1;
    q->data[q->rear]=k;
    q->rear=(q->rear+1)%MAX;
    while(q->rear!=q->front){
        i=q->data[q->front];
        q->front=(q->front+1)%MAX;
        for(j=0;jarcnum;j++){
            if((g->arcs[i][j]==1)&&(!visited[j])){
                printf("%c",g->vexs[j]);
                visited[j]=1;
                q->data[q->rear]=j;
                q->rear=(q->rear+1)%MAX;
            }
        }
    }

void TBFS(MGraph *g){
    int i;
    for(i=0;ivexnum;i++){
        if(visited[i]!=1){
            BFS(i,g);
        }
    }
}

(4)对于采用邻接表存储结构的图,同样可以利用广度优先搜索的原理进行算法设计。 

相关内容

热门资讯

电脑一直蓝屏然后反复自动重启,... 电脑一直蓝屏然后反复自动重启,就是没办法开机,一直出现这个蓝屏反复重启,该怎么办?您好,有可能是硬盘...
钢琴一般要多久才能考到6级或6... 钢琴一般要多久才能考到6级或6级以上?这个要看学习的人的刻苦程度和悟性了,还有就是成人还是小孩,也不...
叫李可然女性全国有多少个? 叫李可然女性全国有多少个?你好,具体数字无法回答,但全国至少有几万人叫这个名字。估计有很多,我认识的...
七喜的广告语是什么 七喜的广告语是什么七喜饮料:非可乐 备注:七喜饮料和七喜电脑不是一家的七喜汽水面世之初,面临百事可乐...
起凡群雄逐鹿新版本锦囊如何无限... 起凡群雄逐鹿新版本锦囊如何无限重转?起凡群雄逐鹿新版更新后,转锦囊是显示会员可以无限重转,可我弄不好...
推荐几本初中生不枯燥的名著和小... 推荐几本初中生不枯燥的名著和小说1,穆斯林的葬礼2,平凡的世界名著的话《飘》《基督山伯爵》很好看一点...
沙溢所有的情景剧 沙溢所有的情景剧说下名字 2001年《炊事班的故事》帅胡 2002年《都市男女》张杰瑞200...
儿童消防作文怎么写 儿童消防作文怎么写儿童消防作文怎么写消防演习今天,老师通知我们下午放学好举行消防演习,在老师宣布的时...
故事很长,如何接下句? 故事很长,如何接下句?1、故事很长,结局很甜。2、故事很长,从何说起。3、故事很长,且慢慢道来。4、...
烛影斧声是什么典故 烛影斧声是什么典故 ?烛影斧声,是友尺友指宋开宝九年,宋太祖赵匡胤大病,召弟弟赵光义议事,两人屏...
奇妙的桥有那些? 奇妙的桥有那些?赵州桥是最古老的拱桥,卢沟桥的狮子数不清
余生有你才安好为什么是悲剧 余生有你才安好为什么是悲剧余生有你才安好为什么是悲剧《余生有你才安好》下册魅力出版社已经出了,你可以...
细节决定成败,态度决定一切.这... 细节决定成败,态度决定一切.这句话是怎么理解?我记得有说过这样一句话,小事做不好,我绝不相信你大事能...
2012年寒假读一本好书的推荐... 2012年寒假读一本好书的推荐书有哪些?我六年级~小说也行~假如给我三天光明。草房子。夏洛的网。
震耳欲聋算是成语吗 震耳欲聋算是成语吗 是震耳欲聋zhèn ěr yù lóng[释义] 耳朵都要振聋了。形容很大...
求推荐一些恐怖灵异小说,不要后... 求推荐一些恐怖灵异小说,不要后面变成盗墓玄幻修仙的求推荐一些恐怖灵异小说,不要后面变成盗墓玄幻修仙的...
可以讲视频和定格动画结合吗? 可以讲视频和定格动画结合吗?可以,最难的是对时间线,通过抠蓝背的方式,可以将视频内容或者定格动画放在...
求古代言情小说,超虐心,不要超... 求古代言情小说,超虐心,不要超长和复杂,像<冷情王爷的虐爱:替身王妃>和<蚀骨恩宠:残暴王爷的弃妃>...
如何炒花生,使花生仁酥脆,花生... 如何炒花生,使花生仁酥脆,花生壳不黑?呵呵,拿到炸菜籽油的地方让别人炒,壳一点都不会黑的哦,味道也很...
求适合用作华尔兹练习曲的流行歌... 求适合用作华尔兹练习曲的流行歌(或轻音乐)许茹芸的日光机场爱的华尔兹——一起来看流星雨的歌