
关于深度优先顶点顺序的感想
发布日期:2021-05-07 05:54:09
浏览次数:21
分类:精选文章
本文共 2085 字,大约阅读时间需要 6 分钟。
众所周知,DFS可以用递归实现,也可以用栈来实现。某算法书上用递归实现,说顶点顺序的种类有两种,我又用栈实现,顶点的顺序又多了两种。不同的顶点顺序可以适应不同场合。
BFS只有一种顺序。 要注意的是,如果要记录双亲结点,visited[]i可以存储i双亲结点,未被访问的设为-1,被访问的根节点设为-2。这样可以保证存储的元素是0时一定是指的双亲结点是0,没有歧义。如果不记录双亲结点,visited[i]为0代表i未访问,visited[i]为1代表i已访问。邻接表
package dfs;class AGraph{ int n; int e=0; VNode adjlist[]; public AGraph(int n) { super(); this.n = n; adjlist=new VNode[n]; } }package dfs;class ArcNode{ int adjvex; ArcNode nextarc; int weight;//weight就是adjlist[i]->adjvex的权重 //对应于邻接矩阵的权重m[i][adjvex] AGraph a;//记录边数时,需要图a int edge_type=0;//初始化为回边(P99.8) public ArcNode(int adjvex, AGraph a) { super(); this.adjvex = adjvex; this.a = a; a.e+=1; } package dfs;class VNode{ //邻接矩阵的顶点也可以用这个 ArcNode firstarc; char info; int level;//对应于99.8,对每个点,都要有层级 public VNode(char info) { this.info = info; } }
栈实现(这里的两种顺序是进栈顺序和出栈顺序,这两种和下面递归的进栈顺序和出栈顺序不一样):
public static void dfs1(AGraph a,int start,int visited[])//用栈和邻接表 { //-1表示未访问,-2表示是起始节点(前面没东西) //这样才不会与数组index冲突 int stack[]=new int[a.n]; int top=-1; stack[++top]=start; visited[start]=-2; while(top!=-1) { int x=stack[top--]; ArcNode arc=a.adjlist[x].firstarc; while(arc!=null) { if(visited[arc.adjvex]==-1) { stack[++top]=arc.adjvex; visited[arc.adjvex]=x;} arc=arc.nextarc; } } /*如果我们要输出一条路径可以这样 * 假设start为起点,x是终点 * * * 在while(top!=-1) * 里面加上,找到x就break; * * * * if(top!=-1) * { * while(x!=-2) * { * System.out.println(x); * x=visited[x]; *} * } * * else 没有路径 * * *这样输出是倒序的,可以用一个栈储存然后正过来 *或者用递归 */ }public static void DFS1(AGraph a){ //-1表示未访问,-2表示是起始节点(前面没东西) int visited[]=new int[a.n]; for(int i=0;i
递归实现:
public static void dfs3(AGraph a,int start,int visited[],int before) { visited[start]=before; //进栈操作(按照课本上那种进栈顺序) ArcNode arc=a.adjlist[start].firstarc; while(arc!=null) { if(visited[arc.adjvex]==-1) { dfs3(a,arc.adjvex,visited,start);} arc=arc.nextarc; } //出栈操作(按照课本上出栈顺序) }public static void DFS3(AGraph a){ //-1表示未访问,-2表示是起始节点(前面没东西) int visited[]=new int[a.n]; for(int i=0;i
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月04日 08时37分42秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP 正则表达式资料
2019-03-06
PHP官方网站及PHP手册
2019-03-06
mcrypt加密以及解密过程
2019-03-06
mysql连续聚合
2019-03-06
go等待N个线程完成操作总结
2019-03-06
消息队列 RocketMQ 并发量十万级
2019-03-06
ReactJs入门教程-精华版
2019-03-06
乐观锁悲观锁应用
2019-03-06
.net Core 使用IHttpClientFactory请求
2019-03-06
多线程之旅(准备阶段)
2019-03-06
Python 之网络式编程
2019-03-06
MySql5.5安装步骤及MySql_Front视图配置
2019-03-06
mybatis #{}和${}区别
2019-03-06
Java Objects工具类重点方法使用
2019-03-06
Java内存模型(JMM)
2019-03-06
AQS相关
2019-03-06