图论15-有向图-环检测+度数+欧拉回路

文章目录

  • 1. 有向图设计
    • 1.1 私有变量标记是否有向
    • 1.2 添加边的处理,双向变单向
    • 1.3 删除边的处理,双向变单向
    • 1.4 有向图的出度和入度
  • 2 有向图的环检测
    • 2.1 普通的算法实现换检测
    • 2.2 拓扑排序中的环检测
  • 3 欧拉回路

1. 有向图设计

1.1 私有变量标记是否有向

private boolean directed;
  • 设计接口来判断是否有向:
public boolean isDirected(){return directed;
}

1.2 添加边的处理,双向变单向

遍历文件给出的相邻顶点时,如果邻接表上有节点,就添加一条边。

如果是无向图,反过来添加边。

adj[a].add(b);// 如果是无向图
if(!directed)adj[b].add(a);

1.3 删除边的处理,双向变单向

public void removeEdge(int v, int w){validateVertex(v);validateVertex(w);if(adj[v].contains(w)) E --;adj[v].remove(w);if(!directed)adj[w].remove(v);
}

1.4 有向图的出度和入度

设计两个数组分别记录对应节点的出度和入度

private int[] indegrees, outdegrees;indegrees = new int[V];
outdegrees = new int[V];

添加边的时候,更新相应的度数值

for(int i = 0; i < E; i ++){int a = scanner.nextInt();validateVertex(a);int b = scanner.nextInt();validateVertex(b);if(a == b) throw new IllegalArgumentException("Self Loop is Detected!");if(adj[a].contains(b)) throw new IllegalArgumentException("Parallel Edges are Detected!");adj[a].add(b);if(directed){outdegrees[a] ++;indegrees[b] ++;}if(!directed)adj[b].add(a);
}
  • 度数的接口
public int degree(int v){if(directed)throw new RuntimeException("degree only works in undirected graph.");validateVertex(v);return adj[v].size();
}public int indegree(int v){if(!directed)throw new RuntimeException("indegree only works in directed graph.");validateVertex(v);return indegrees[v];
}public int outdegree(int v){if(!directed)throw new RuntimeException("outdegree only works in directed graph.");validateVertex(v);return outdegrees[v];
}

2 有向图的环检测

2.1 普通的算法实现换检测

设计新的数组记录当前路径.

标记当前路径和标记是否访问过的区别,标记是否访问过时为了避免在dfs过程中检测环的时候重复检测已经访问过的节点。

0-1-2-4-2-1,退回到1 的时候,由于2已经标记访问过,因此下一个节点访问3.
在这里插入图片描述
onPath的时候,退回到0-1时,将24重新标记为false,因为已经不在当前路径中:

0-1-2-4
0-1

访问到3的时候onPath为:0-1-3,下一个节点访问1,由于1已经在onPath中,则直接返回环检测结果。

private boolean[] onPath;
private boolean dfs(int v){visited[v] = true;onPath[v] = true;for(int w: G.adj(v))if(!visited[w]){if(dfs(w)) return true;}else if(onPath[w])return true;onPath[v] = false;return false;
}

在这里插入图片描述

2.2 拓扑排序中的环检测

能够进行拓扑排序的图是没有环的,否则无法进行拓扑排序。
在拓扑排序的实现过程中,如果返回的res数组中的点的数量与图的点的数量不一致,则说明有环。因为环上的点由于度数无法为0,无法进入队列,从而进入res数组返回答案。
在这里插入图片描述

if(res.size() != G.V()){hasCycle = true;res.clear();
}

3 欧拉回路

在这里插入图片描述

  • 判断出度和入度即可
private boolean hasEulerLoop(){for(int v = 0; v < G.V(); v ++)if(G.indegree(v) != G.outdegree(v))return false;return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/144098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

燃气管网监测系统|全面保障燃气安全

根据新华日报的报道&#xff0c;2023年上半年&#xff0c;我国共发生了294起燃气事故&#xff0c;造成了57人死亡和190人受伤&#xff0c;燃气事故的发生原因有很多&#xff0c;其中涉及到燃气泄漏、设备故障等因素。因此&#xff0c;加强燃气安全管理&#xff0c;提高城市的安…

在 Kubernetes 上运行 Elasticsearch

Kubernetes&#xff08;快速&#xff09;入门 Kubernetes 是一种容器编排技术&#xff0c;这只是一种奇特的说法&#xff0c;它可以帮助您管理和运行打包的应用程序。它基本上看起来像这样&#xff1a; 库伯内特斯架构 Kubernetes 基本架构 您的应用程序&#xff08;例如博客软…

vue、react中虚拟的dom

React中虚拟DOM的例子&#xff1a; 下面是一个使用React创建的简单的计数器组件&#xff1a; import React, { Component } from react;class Counter extends Component {constructor(props) {super(props);this.state {count: 0};}handleClick () > {this.setState({c…

httpClient超时时间详解与测试案例

使用httpclient作为http请求的客户端时&#xff0c;我们一般都会设置超时时间&#xff0c;这样就可以避免因为接口长时间无响应或者建立连接耗时比较久导致自己的系统崩溃。通常它里面设置的几个超时时间如下&#xff1a; RequestConfig config RequestConfig.custom().setCo…

电磁场与电磁波part1--矢量分析

目录 1、方向导数 2、散度定理&#xff08;高斯定理&#xff09; 3、散度与旋度的比较 4、旋度定理&#xff08;斯托克斯定理&#xff09; 5、关于点乘、叉乘、梯度、散度、旋度的计算 ~~~~~~~~~~~~~~~~~~~~~~~~ 确认过眼神&#xff0c;是我看不懂的 ~~~~~~~~~~~~~~~~…

IDEA没有Add Framework Support解决办法

点击File—>Settings 点击第一个设置快捷键 点击apply和ok即可 我们要点击一下项目&#xff0c;再按快捷键ctrlk 即可

C++入门(2)—函数重载、引用

目录 一、函数重载 1、参数类型不同 2、参数个数不同 3、参数顺序不同 4、 链接中如何区分函数重载 二、引用 1、规则 2、特征 3、使用场景 做参数 做返回值 4、常引用 5、传值、传引用效率比较 6、引用和指针的区别 接上一小节C入门(1)—命名空间、缺省参数 一…

Python 如何实现适配器设计模式?什么是适配器(Adapter)设计模式?

什么是适配器设计模式&#xff1f; 适配器&#xff08;Adapter&#xff09;设计模式是一种结构型设计模式&#xff0c;它允许接口不兼容的类之间进行合作。适配器模式充当两个不兼容接口之间的桥梁&#xff0c;使得它们可以一起工作&#xff0c;而无需修改它们的源代码。 主要…

JXLS 导出多sheet,带页眉页脚

/*** 生成多sheet Excel* 带自定义页眉页脚** param templatePath* param sheetList* return* throws IOException*/public static byte[] generateMultiSheet(String templatePath, List<JxlsHelper2.SheetContext> sheetList) throws IOException {ByteArrayOutputStre…

C++ 基础

准备工具Vscode或者Clion或者Dev C或者Vs studio 和 MSYS2 是C跨平台的重要工具链. 基础一 准备工作安装MSYS2软件 创建文件 一、基本介绍1.1C源文件1.2 代码注释1.3变量与常量1.3.1变量1.3.2 常量1.3.3 二者的区别&#xff1a; 1.4 关键字和标识符 二、数据类型2.1 基本数据类…

Flink CDC

1、Flink CDC的介绍&#xff1a; 是一种技术&#xff0c;可以帮助我们实时的捕获数据库中数据的变化&#xff0c;并将这些变化的数据以流的形式传输到其他的系统中进行处理和存储。 2、Flink CDC的搭建&#xff1a; 1、开启mysql的binlog功能&#xff1a; # 1、修改mysql配置…

C/C++ 实现获取硬盘序列号

获取硬盘的序列号、型号和固件版本号&#xff0c;此类功能通常用于做硬盘绑定或硬件验证操作&#xff0c;通过使用Windows API的DeviceIoControl函数与物理硬盘驱动程序进行通信&#xff0c;发送ATA命令来获取硬盘的信息。 以下是该程序的主要功能和流程&#xff1a; 定义常量…

2023版Idea创建JavaWeb时,右键new没有Servlet快捷键选项

问题&#xff1a;右键时&#xff0c;没有创建servlet的快捷键&#xff0c;如下图&#xff1a; 解决方法&#xff1a; 1.打开idea&#xff0c;点击File>settings(设置)&#xff0c;进入settings页面&#xff0c;如下 从上图中的Files选项中没看到有servlet选项&#xff0c;…

2023NOIP A层联测32

2023NOIP A层联测32 文章目录 2023NOIP A层联测32A flandreB.meirinC.sakuyaD. 红楼 ~ Eastern Dream总结 A flandre 有 n n n 种烟花&#xff0c;每种烟花有两个参数 a &#xff0c; b a &#xff0c; b a&#xff0c;b&#xff0c;你要构造一种燃放顺序&#xff0c;使得 …

正则表达式入门教程

一、本文目标 让你明白正则表达式是什么&#xff0c;并对它有一些基本的了解&#xff0c;让你可以在自己的程序或网页里使用它。 二、如何使用本教程 文本格式约定&#xff1a;专业术语 元字符/语法格式 正则表达式 正则表达式中的一部分(用于分析) 对其进行匹配的源字符串 …

Rancher 容器中使用 jmap 工具导出内存日志

提升容器权限 编辑容器工作负载&#xff0c;在【安全/主机设置】中选中【特权模式】的【是&#xff1a;容器具有所有主机访问权限】 进入容器命令行&#xff0c;执行 jmap 命令 # 获取服务 pid ps -ef | grep java # 执行 jmap 导出内存日志 jmap -dump:live,formatb,file/hom…

线程锁的应用与示例代码

为了解决这个问题&#xff0c;可以使用线程锁来确保在提取zip文件中的每个文件时&#xff0c;同一时间只有一个线程可以访问文件。这样可以避免多个线程同时访问和写入文件&#xff0c;从而解决race condition的问题。以下是修改后的示例代码&#xff1a; python import reque…

提升pip速度!设置pip全局镜像源,速度飞起!

文章目录 💢 问题 💢💯 解决方案 💯🐾 镜像源🐾 镜像全局配置🍄 Windows系统🍄 Linux和macOS系统🍄 添加环境变量的方式💢 问题 💢 由于“某些网络限制”原因,我们在使用pip安装python模块的时候速度会比较慢,这个时候我们就需要用到一些镜像源,本文将…

R语言提取文字(字符串)中的内容--正则式(2)

科学研究中有时候咱们收集到的数据很乱&#xff0c;不能马上进行分析&#xff0c;如SEER数据&#xff0c;用过都知道&#xff0c;咱们需要对数据进行清洗&#xff0c;从数据中提取咱们需要的东西&#xff0c;才能进行分析&#xff0c;这时候有个有用的东西叫正则式&#xff0c;…

Service Worker是什么?

Service Worker 是一种在 Web 浏览器中运行的脚本&#xff0c;它独立于网页的上下文&#xff0c;并且可以在用户关闭网页后仍然在后台运行。Service Worker 可以用于实现许多功能&#xff0c;包括离线缓存、消息推送和网络代理等。 Service Worker 是一种浏览器技术&#xff0…