news 2026/8/7 21:30:54

java.有向图邻接表深度优先遍历手写心得

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java.有向图邻接表深度优先遍历手写心得

基本思路就是:构造一个列表这个列表的每个元素是一个列表,

private List<List<Integer>> arrList;

然后就是为arrList添加列表,和顶点数相同,一定要注意的是不能光写一个for循环,

for (int i=1;i<=total;i++){ arrList.add(new ArrayList<>()); }

要这样写!如下图,在这个构造方法中for循环之前一定要多一步arrList.add(new ArrayList<>());

因为你循环为每个节点加列表的时候,arrList.add默认会从尾部加,也就是说我想跳过arrList[0],只加到索引1~5,是不可能的,系统会默认从索引0开始加所以,只用for循环加列表,实际上是从arrList的索引为0开始加,加到索引为4,最后一个索引5不会拥有一个列表,因此程序会报错。

public youGraphDfs2(int total){ this.total=total; this.arrList=new ArrayList<>(total+1); //total +1 arrList.add(new ArrayList<>()); for (int i=1;i<=total;i++){ arrList.add(new ArrayList<>()); } }

接着就是添加边,邻接表法构造有向图,就是arrList中的每个元素代表一个顶点,顶点又是一个列表,每个顶点的列表存储顶点的邻居顶点,又因为是有向图不需要双向添加,只需要添加一次即可,然后再进行深度优先遍历。

public void addEdge(int i,int j){ arrList.get(i).add(j); //添加用list操作方法,get和add }

深度优先遍历,有两个方法,两个方法的本质是一样的都是递归遍历,其二是封装调用函数。其一:

public void dfs(int start,boolean[] visit){ visit[start]=true; System.out.print("V"+start+" "); //邻接表深度优先是队列形式 for(int neighbor:arrList.get(start)){ if(!visit[neighbor]){ dfs(neighbor,visit); } }

其二:

public void dfs(int start){ boolean[] visit=new boolean[total+1]; dfsUtil(start,visit); } public void dfsUtil(int i,boolean[] visit){ visit[i]=true; System.out.print("V"+i+" "); //!!遍历它所有的邻居节点,就是不断的先遍历第一个列表找到每一个的邻居 for(int neighbor:arrList.get(i)){ if(!visit[neighbor]){ dfsUtil(neighbor,visit); } }

完整代码展示:

package 算法; import java.util.ArrayList; import java.util.List; public class youGraphDfs2 { //链表法写 private int total; private List<List<Integer>> arrList; public youGraphDfs2(int total){ this.total=total; this.arrList=new ArrayList<>(total+1); //total +1 arrList.add(new ArrayList<>()); for (int i=1;i<=total;i++){ arrList.add(new ArrayList<>()); } } public void addEdge(int i,int j){ arrList.get(i).add(j); //添加用list操作方法,get和add } public void dfs(int start,boolean[] visit){ visit[start]=true; System.out.print("V"+start+" "); //邻接表深度优先是队列形式 for(int neighbor:arrList.get(start)){ if(!visit[neighbor]){ dfs(neighbor,visit); } } // public void dfs(int start){ // boolean[] visit=new boolean[total+1]; // dfsUtil(start,visit); // } // public void dfsUtil(int i,boolean[] visit){ // visit[i]=true; // System.out.print("V"+i+" "); // //!!遍历它所有的邻居节点,就是不断的先遍历第一个列表找到每一个的邻居 //// for(int j=1;j<=total;j++){ //// if(arrList.get(i).get()) //// } // //for // for(int neighbor:arrList.get(i)){ // if(!visit[neighbor]){ // dfsUtil(neighbor,visit); // } // } // } public static void main(String[] args) { youGraphDfs2 y=new youGraphDfs2(5); y.addEdge(1, 2); y.addEdge(1, 4); y.addEdge(4, 3); y.addEdge(3, 2); y.addEdge(3, 5); y.addEdge(2, 5); boolean[] visit=new boolean[y.total+1]; y.dfs(1,visit); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 3:40:39

MiniCPM-V 4.5

目录 1. 引言 问题背景 解决方案 性能亮点 贡献 2. 方法 2.1 模型架构&#xff08;Architecture&#xff09; 2.2 预训练&#xff08;Pre-training&#xff09; 2.3 监督微调&#xff08;Supervised Fine-Tuning, SFT&#xff09; 2.4 强化学习&#xff08;Reinforce…

作者头像 李华
网站建设 2026/8/7 13:19:32

Flutter工程化与协作实践指南

欢迎大家加入开源鸿蒙跨平台开发者社区&#xff0c;一起共建开源鸿蒙跨平台生态。 Flutter工程化与协作实践指南 工程化核心要素 模块化设计 采用feature-first架构设计&#xff0c;每个功能模块独立封装业务逻辑、数据层和UI组件&#xff0c;通过Dart的export机制统一管理…

作者头像 李华
网站建设 2026/8/7 18:42:53

Excel技巧:提取身份证号码中的出生年月日

制作excel表格中总是少不了要从一组数据中提取部分数据出来&#xff0c;比如在身份证号码中提取出生日期&#xff0c;今天分享方法给大家。 在出生日期单元格内输入公式&#xff1a;MID(B2,7,8) 公式注释&#xff1a;内容提取单元格位置&#xff0c;第几位开始&#xff0c;取…

作者头像 李华
网站建设 2026/8/7 18:55:41

软工毕业设计创新的开题分享

0 选题推荐 - 大数据篇 毕业设计是大家学习生涯的最重要的里程碑&#xff0c;它不仅是对四年所学知识的综合运用&#xff0c;更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要&#xff0c;它应该既能体现你的专业能力&#xff0c;又能满足实际应…

作者头像 李华
网站建设 2026/8/7 12:26:58

Oracle数据库物理备份与恢复实战指南

1. RMAN基础概念1.1 什么是RMANRMAN&#xff08;Recovery Manager&#xff09;是Oracle 8i以后DBA的重要工具&#xff0c;位于$ORACLE_HOME/bin目录下&#xff0c;主要用于备份、还原和恢复操作。imageRMAN组成&#xff1a;可执行文件&#xff1a;rman库文件&#xff1a;recove…

作者头像 李华