无向图的广度优先遍历和深度优先遍历

2023-11-01

public class MGraph {
private char[] vexs;// 顶点
private int[][] edge;// 存储边的二维数组
private int arcNum;// 边的数目
private boolean[] visited;// 访问标志数组

// 确定顶点在图中的位置
public int locataVex(char vex) {
for (int i = 0; i < vexs.length; i++) {
if (vex == vexs[i]) {
return i;
}
}
return -1;
}

// 构造无向图
public MGraph(int vexNo) throws IOException {
// 初始化访问数组
visited = new boolean[vexNo];
for (int i = 0; i < vexNo; i++) {
visited[i] = false;

}
// 顶点初始化
vexs = new char[vexNo];
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
for (int i = 0; i < vexNo; i++) {
String value = reader.readLine();
char c = value.charAt(0);
vexs[i] = c;
}
// 初始化边的二维数组 默认都不相连 用0来表示
edge = new int[vexNo][vexNo];
for (int i = 0; i < vexNo; i++) {
for (int j = 0; j < vexNo; j++) {
edge[i][j] = 0;
}
}
// 输入边的数目
arcNum = Integer.parseInt(reader.readLine());
// 输入边的信息
for (int i = 0; i < arcNum; i++) {
System.out.println("请输入一条边所依附的两个顶点");
String value1 = reader.readLine();
char v1 = value1.charAt(0);
String value2 = reader.readLine();
char v2 = value2.charAt(0);

int m = locataVex(v1);
int n = locataVex(v2);

edge[m][n] = 1;
edge[n][m] = 1;
}
}

// v是图中的某个结点 返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1
public int FirstAdjVex(char v) {
int i;
// 先确定v在顶点数组中的位置
i = locataVex(v);

// 返回第一个邻接定点的序号

for (int j = 0; j < vexs.length; j++) {
if (edge[i][j] == 1) {

return j;
}
}
// 如果没有邻接结点 则返回-1
return -1;

}

// int NextAdjVex(MGraph G,VertexType v,VertexType w)初始条件:
// 图G存在,v是G中某个顶点,w是v的邻接顶点 */
// 返回v的(相对于w的)下一个邻接顶点的序号 如果w是v的最后一个结点 则返回-1
public int NextAdjVex(char v, char w) {
int i;
// 先确定v在顶点数组中的位置
i = locataVex(v);

// 返回第一个邻接定点的序号
int j = locataVex(w);
for (j = j + 1; j < vexs.length; j++) {
if (edge[i][j] == 1) {

return j;
}
}
// 如果没有邻接结点 则返回-1
return -1;

}

// 深度优先遍历图 从第v个顶点开始
public void DFsTraverse(int v) {

// 对v尚未访问的邻接顶点进行DFS
for (int i = 0; i < vexs.length; i++) {
if (visited[i] == false) {
DFS(i);
}
}

}

public void DFS(int v) {
// 访问v结点
visited[v] = true;
System.out.println(vexs[v]);

for (int i = FirstAdjVex(vexs[v]); i >= 0; i = NextAdjVex(vexs[v],
vexs[i])) {
if (visited[i] == false) {
DFS(i);
}
}

}

// 广度优先遍历图

public void BFSTraverse() {
// 初始化队列
Queue queue = new LinkedList();
for (int i = 0; i < vexs.length; i++) {
if (visited[i] == false) {
queue.add(i);
while (!queue.isEmpty()) {
int v = (Integer) queue.remove();
if (visited[v] == false) {
visited[v] = true;
System.out.println(vexs[v]);
}
for (int j = FirstAdjVex(vexs[v]); j >= 0; j = NextAdjVex(
vexs[v], vexs[j])) {
if (visited[j] == false) {
queue.add(j);
}
}

}
}
}
}

public char[] getVexs() {
return vexs;
}

public void setVexs(char[] vexs) {
this.vexs = vexs;
}

public int[][] getEdge() {
return edge;
}

public void setEdge(int[][] edge) {
this.edge = edge;
}

public int getArcNum() {
return arcNum;
}

public void setArcNum(int arcNum) {
this.arcNum = arcNum;
}

public boolean[] getVisited() {
return visited;
}

public void setVisited(boolean[] visited) {
this.visited = visited;
}

}

//当用邻接矩阵来表示图的时候,其中图的深度优先遍历的算法时间复杂度是0(n*n),而BFS 算法的时间复杂度为 O(n+e) ,此处 e 为无向图中边的数目或有向图中弧的数目
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无向图的广度优先遍历和深度优先遍历 的相关文章

随机推荐

  • ArrayList集合及常用方法的使用

    ArrayLise
  • Spring IOC容器初始化过程 源码分析

    本文主要记录Spring容器创建 源码分析过程 首先贴上一张时序图 好久没画 忘的差不多了 画的不好 可以凑合看一下 接下来 贴上一份测试代码 这里使用AnnotationConfigApplicationContext来初始化Spring
  • upload-labs(11~12)通关笔记

    环境准备 1 php版本 lt 5 3 4 2 magic quotes gpc Off php我用的是upload labs官方推荐的5 2 17 搭建平台用的是phpStudy2018 修改magic quotes gpc magic
  • Java实现邮件发送功能

    确定发件人邮箱和密码 某些邮箱服务器为了增加邮箱本身密码的安全性 给 SMTP 客户端设置了独立密码 有的邮箱称为 授权码 对于开启了独立密码的邮箱 这里的邮箱密码必需使用这个独立密码 授权码 确认发件人邮箱的 SMTP 服务器地址 发件人
  • python人工智能:模型关系(泉舟时代)

    1 授课 林德尧 泉舟时代 未来城市技术总监 2 主要文章内容 通常下 Flask SQLAlchemy 的行为就像一个来自 declarative 扩展配置正确的 declarative 基类 因此 我们强烈建议您阅读 SQLAlchem
  • 《机器学习》Chapter 5 神经网络笔记

    机器学习 Chapter 5 神经网络 1 神经元模型 神经元接收到来自n个其它神经元传递过来的输入信号 这些输入信号通过带权重的连接进行传递 神经元接收到的总输入值将与神经元的阈值进行比较 然后通过激活函数处理以产生神经元的输出 2 感知
  • 使用css去除input边框

  • 不同CUDA版本对应的最小GPU运算能力和最低兼容驱动

    The minimum compute capability for various CUDA versions CUDA Version Minimum Compute Capability Default Compute Capabil
  • 使用 Python 进行游戏脚本编程 [翻译]

    翻译自 GDC 2002 上 Bruce Dawson 的 Game Scripting in Python 简单介绍 Python 作为游戏脚本语言的优势 原文 Game Scripting in Python 作者 Bruce Daws
  • 机器学习的环境搭建流程

    一 需要 python解释器 pycharm anaconda 机器学习需要的第三方包 二 流程 1 先确定进行机器学习需要的主要包之间的依赖关系及对应的python版本 建议python版本不要太高 3 6或者3 7比较好 因为许多第三方
  • 后端进阶之路——综述Spring Security认证,授权(一)

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 前端炫酷代码分享 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架构咱们从0说 数据流通的精妙之道 后端进阶之路 文章
  • 【华为OD机试真题 Python】最左侧冗余覆盖子串

    前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun09
  • 简单的编写一个通讯录并可进行增删改查功能

    改通讯录分为三个模块 test c contact c contact h 下面依次给我相应的代码 有想问的或者觉得有帮助的帮忙点个赞和关注一下哈 蟹蟹 主要用到了结构体指针来进行对结构体的修改查找之类的算法 test c define C
  • iOS 底层解析weak的实现原理

    参考地址 http www cocoachina com ios 20170328 18962 html weak 实现原理的概括 Runtime维护了一个weak表 用于存储指向某个对象的所有weak指针 weak表其实是一个hash 哈
  • 深度学习之---yolov1,v2,v3详解

    写在前面 如果你想 run 起来 立马想看看效果 那就直接跳转到最后一张 动手实践 看了结果再来往前看吧 开始吧 一 YOLOv1 简介 这里不再赘述 之前的我的一个 GitChat 详尽的讲述了整个代码段的含义 以及如何一步步的去实现它
  • 【数字转换为汉字】

    项目场景 通常这种情况下 后端返回是数组 如果想要把数组这样显示出来 就需要把数组的索引值转换为汉字显示 如 11显示为十一 21显示为二十一 实现代码讲解 NoToChinese num 如果传递过来的值不是数据类型 则直接报错 if d
  • 蓝桥杯C/C++省赛:振兴中华

    目录 题目描述 思路分析 AC代码 题目描述 小明参加了学校的趣味运动会 其中的一个项目是 跳格子 地上画着一些格子 每个格子里写一个字 如下所示 从我做起振 我做起振兴 做起振兴中 起振兴中华 比赛时 先站在左上角的写着 从 字的格子里
  • Vue_shop(Element-UI)优化打包上线

    自己从头到尾打的源码链接 https gitee com bai xianger vue shop 一 项目的打包优化 1 网页顶部添加进度条效果 安装运行依赖nprogresst 链接 https github com rstacruz
  • 1053. 交换一次的先前排列

    转载请声明地址四元君 1053 交换一次的先前排列 题目难度 Medium 给你一个正整数的数组 A 其中的元素不一定完全不同 请你返回可在 一次交换 交换两数字 A i 和 A j 的位置 后得到的 按字典序排列小于 A 的最大可能排列
  • 无向图的广度优先遍历和深度优先遍历

    public class MGraph private char vexs 顶点 private int edge 存储边的二维数组 private int arcNum 边的数目 private boolean visited 访问标志数