数据结构之DFS(邻接表版)
来源:互联网 发布:业务流程优化研究现状 编辑:程序博客网 时间:2024/06/11 09:46
图的遍历 是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。
图的遍历是图的基本操作之一,很多需要对图中每个顶点依次进行的操作都可以在遍历中完成。图的遍历通常有 深度优先搜索和广度优先搜索 。
深度优先搜索(Depth-First Search)
深度优先搜索的基本思想如下:
1、从图中某个顶点Vi出发,首先访问Vi
2、选择一个与刚访问过的顶点Vi相邻接且未访问过的顶点Vj,然后访问该顶点。以该顶点为新顶点,重复本步骤,直到当前顶点没有未访问的邻接点为止。
3、返回前一个访问过的且仍有未访问的邻接点的顶点,找出并访问该顶点的下一个未访问的邻接点,然后执行步骤 2。
PS:若访问的是非连通图,我们从某个顶点出发进行深度优先搜索后,则该顶点所在的连通分量的所有顶点都将被访问。此时,若图中还有顶点未访问,则另选图中一个未访问的顶点作为起始点,重复上述深度优先搜索过程,直至图中所有顶点均访问过为止。
对图进行深度优先搜索时,按访问顶点的先后次序得到的顶点的序列称为图的深度优先搜索序列,简称DFS序列。一个图的DFS序列可能不唯一,它与所采用的算法的存储结构和初始出发点密切相关。
邻接表版的DFS
完整代码
#include<stdio.h>#include<malloc.h>#define max 100typedef struct node{ int adjvex; struct node*next;}arcnode;typedef struct { int vertex; arcnode*firstarc;}vexnode;vexnode adjlist[max];int creatadjlist(){ arcnode*ptr; int arcnum,vexnum,k,v1,v2; printf("input the vexnum,arcnum:"); scanf("%d,%d",&vexnum,&arcnum); for(k=1;k<=vexnum;k++) adjlist[k].firstarc=0; for(k=0;k<arcnum;k++) { printf("v1,v2=");scanf("%d,%d",&v1,&v2); ptr=(arcnode*)malloc(sizeof(arcnode)); ptr->adjvex=v2; ptr->next=adjlist[v1].firstarc; adjlist[v1].firstarc=ptr; ptr=(arcnode*)malloc(sizeof(arcnode)); ptr->adjvex=v1; ptr->next=adjlist[v2].firstarc; adjlist[v2].firstarc=ptr; } return vexnum;}void dfs(int *v){ int *w; arcnode*p; p=adjlist[*v].firstarc; printf("%d ",*v); adjlist[*v].vertex=1; while(p!=NULL) { *w=p->adjvex; if(adjlist[*v].vertex==0) dfs(w); p=p->next; }}int main(){ int i,n,*v; arcnode*p; n=creatadjlist(); printf("the Adjacency List:\n"); for(i=1;i<=n;i++) { printf("%d==>",i); p=adjlist[i].firstarc; while(p!=NULL) { printf("----->%d",p->adjvex); p=p->next; } putchar('\n'); } printf("the dfs's node v is:");scanf("%d",v); printf("the dfs:");dfs(v); return 0;}
总结
DFS的核心就是不断的访问顶点,本例采用的是较为普遍的做法,设置一个标志(adjlist[v].vertex),若标志等于1则表明访问过,若标志等于0则未访问过,然后再进行递归,当然递归传参记得用引用,不然是不会起到什么效果的。
阅读全文
0 0
- 数据结构之DFS(邻接表版)
- 数据结构之BFS(邻接表版)
- 数据结构 邻接链表 DFS
- 数据结构之图(邻接表存储,DFS和BFS遍历)
- 数据结构实验之图论四:迷宫探索(邻接表与DFS)
- 数据结构之无向图邻接表DFS之创建打印生成森林(整理严蔚敏数据结构)
- 数据结构之无向图邻接表DFS之查询遍历关节点(参考整理严蔚敏数据结构)
- 数据结构之无向图邻接表DFS之查询遍历关节点
- 数据结构之无向图的邻接表DFS(参考C博客—研究毛)
- 数据结构之——用C++实现邻接表的DFS与BFS
- 数据结构之(图存储结构之)邻接表
- Codeforces Round #403 (Div. 2) C. Andryusha and Colored Balloons(DFS 邻接表 数据结构)
- 【数据结构】DFS深度优先搜索(分别使用邻接矩阵、邻接表)
- 数据结构 邻接矩阵+邻接表+bfs+dfs+prim+Kruskal综合
- 数据结构之用邻接表实现图(详解)
- 数据结构C语言版之邻接表(各种遍历)
- java数据结构之图(邻接矩阵和邻接表)
- 数据结构---图(邻接表)
- Centos7 搭建git服务器,并利用Gitosis进行权限管理
- 通过一段汇编,加深对寄存器ESP和EBP的理解
- [NOIP2017模拟]subset
- 反射与动态代理
- 深入浅出最大似然估计(Maximum Likelihood Estimation)
- 数据结构之DFS(邻接表版)
- Java基础
- java webservice 开发方法(REST方式)---续(JSON标准输入输出)
- 极限开发与敏捷开发
- ubuntu下安装python-mysql
- [NOIP模拟][dfs]流
- UVA 11478 浅谈差分约束SPFA判负环
- Git 常用命令
- 数列 洛谷p1062