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

news2025/1/23 17:36:48

文章目录

  • 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.coloradmin.cn/o/1209863.html

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

相关文章

Linux文件系统之inode

文章目录 1. 磁盘1.1 认识磁盘1.2 磁盘物理构造1.3 磁盘逻辑结构 2. 文件系统3. 如何理解目录 1. 磁盘 1.1 认识磁盘 文件 内容 属性&#xff0c;而文件是存储在磁盘上&#xff0c;那么可以理解为磁盘上存储的文件 存储的文件内容 存储的文件属性。 文件的内容采用的是块式…

深度学习 机器视觉 车位识别车道线检测 - python opencv 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …

建造者模式(创建型)

目录 一、前言 二、建造者模式 三、链式编程实现建造者模式 四、总结 一、前言 当我们开发一个软件应用时&#xff0c;我们通常需要创建各种对象。有些对象是简单的&#xff0c;可以直接实例化&#xff0c;但有些对象则比较复杂&#xff0c;需要多个步骤才能创建完成。这时…

PP-ChatOCRv2、PP-TSv2、大模型半监督学习工具...PaddleX新特性等你来pick!

小A是一名刚刚毕业的算法工程师&#xff0c;有一天&#xff0c;他被老板安排了一个活&#xff0c;要对一批合同扫描件进行自动化信息抽取&#xff0c;输出结构化的分析报表。OCR问题不大&#xff0c;但是怎么进行批量的结构化信息抽取呢&#xff1f;小A陷入了苦苦思索… 小B是…

【每日一题】K 个元素的最大和

文章目录 Tag题目来源解题思路方法一&#xff1a;贪心 其他语言Cpython3 写在最后 Tag 【贪心】【脑筋急转弯】【数组】【2023-11-15】 题目来源 2656. K 个元素的最大和 解题思路 方法一&#xff1a;贪心 从第一次操作开始每次选择数组中的最大值&#xff0c;由于最大值在…

原论文一比一复现 | 更换 RT-DETR 主干网络为 【ResNet-50】【ResNet-101】【ResNet-152】| 对比实验必备

本专栏内容均为博主独家全网首发,未经授权,任何形式的复制、转载、洗稿或传播行为均属违法侵权行为,一经发现将采取法律手段维护合法权益。我们对所有未经授权传播行为保留追究责任的权利。请尊重原创,支持创作者的努力,共同维护网络知识产权。 更深层的神经网络更难训练。…

一文讲清生产质量场景的数据分析思路及案例实战

今天&#xff0c;顺着制造业数据分析这个大主题&#xff0c;我们来讲讲质量管理数据分析。   说起质量管理&#xff0c;就是对所生产的产品质量进行管理&#xff0c;其最终目的就是保证客户收到的产品质量&#xff0c;提高客户满意度&#xff0c;减少退货和维修的数量。质量管…

IP-guard flexpaper远程命令执行漏洞复现 [附POC]

文章目录 IP-guard flexpaper RCE漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 IP-guard flexpaper RCE漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测…

首发!动手学大模型应用开发教程来了

大模型正逐步成为信息世界的新革命力量&#xff0c;其通过强大的自然语言理解、自然语言生成能力&#xff0c;为开发者提供了新的、更强大的应用开发选择。随着国内外井喷式的大模型 API 服务开放&#xff0c;如何基于大模型 API 快速、便捷地开发具备更强能力、集成大模型的应…

Windows10下Docker安装Mysql5.7

文章目录 Windows10下Docker安装Mysql5.7环境说明打开命令工具搜索镜像拉取镜像查看所有镜像启动镜像查看容器查看所有容器查看运行中容器 进入容器进入容器命令输入账号命令输入密码 添加mysql的远程账号创建一个数据库 Windows10下Docker安装Mysql5.7 环境说明 docker&…

【VBA】基于EXCEL生成Insert语句工具

工具介绍 基于Excel生成INSERT语句工具是一个辅助工具&#xff0c;用于帮助用户根据Excel数据生成INSERT语句。通常&#xff0c;在数据库中插入大量数据时&#xff0c;手动编写INSERT语句会非常繁琐和耗时。而使用这个工具&#xff0c;可以通过Excel中的数据自动生成相应的INS…

【模板】单源最短路径(弱化版)P3371

【模板】单源最短路径&#xff08;弱化版&#xff09; 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&#xff0c;请输出从某一点出发到所有点的最短路…

116.飞行员兄弟

题目链接 思路 明天补 代码 #include<bits/stdc.h> using namespace std; const int N 10; char g[N][N]; char backup[N][N]; int ans 0x3f3f3f3f; vector<pair<int, int>> v; int get(int x, int y) {return x * 4 y; } void turn (int x, int y) {i…

02 # 类型基础:强类型与弱类型

宽泛的定义 在强类型语言中&#xff0c;当一个对象从调用函数传递到被调用函数时&#xff0c;其类型必须与被调用函数中声明的类型兼容 – Liskov, Zilles 1974 通俗定义 强类型语言不允许改变变量的数据类型&#xff0c;除非进行强制类型转换 比如下面 Java 里不能将布尔类…

Python-Python高阶技巧:HTTP协议、静态Web服务器程序开发、循环接收客户端的连接请求

版本说明 当前版本号[20231114]。 版本修改说明20231114初版 目录 文章目录 版本说明目录HTTP协议1、网址1.1 网址的概念1.2 URL的组成1.3 知识要点 2、HTTP协议的介绍2.1 HTTP协议的概念及作用2.2 HTTP协议的概念及作用2.3 浏览器访问Web服务器的过程 3、HTTP请求报文3.1 H…

深入学习 Android Framework 之 SystemServer 进程启动详解

深入学习 Android Framework 第三&#xff1a;深入学习 Android Framework 之 SystemServer 进程启动详解 文章目录 深入学习 Android Framework前言一、Android 系统的启动流程1. 流程图2. 启动流程概述 二、源码详解1. 时序图2. 源代码1、ZygoteInit # main()2、ZygoteInit …

Ubuntu 17.10 “Artful Aardvark” 发布首个 Beta

Ubuntu 17.10 “Artful Aardvark” 首个 Beta 版已发布。 按照 Ubuntu 17.10 的发布日程 &#xff0c;Ubuntu 17.10 首个 beta 版按时发布了。不过参与本次测试版的没有 Ubuntu 官方风味版本&#xff08;要尝试的话可以考虑每日构建 ISO&#xff09;&#xff0c;包括了 Kubunt…

MySQL学习day02

一、SQL通用语法 1&#xff09;SQL语句可以单行或多行书写&#xff0c;以分号结尾 2&#xff09;SQL语句可以使用空格/缩进来增强语句的可读性 3&#xff09;MySQL数据库的SQL语句不区分大小写&#xff0c;关键字建议使用大写 4&#xff09;注释&#xff1a; a)单行注释&#x…

Day30力扣打卡

打卡记录 最长回文子序列&#xff08;区间DP&#xff09; 链接 class Solution:def longestPalindromeSubseq(self, s: str) -> int:n len(s)f [[0] * n for _ in range(n)]max lambda x, y: x if x > y else yfor i in range(n - 1, -1, -1):f[i][i] 1for j in ra…

leetcode二分查找算法题

目录 1.二分查找2.在排序数组中查找元素的第一个和最后一个位置3.x的平方根4.搜索插入位置5.山脉数组的峰顶索引6. 寻找峰值7.寻找旋转排序数组中的最小值8.8.0~n-1中缺失的数字 1.二分查找 二分查找 class Solution { public:int search(vector<int>& nums, int …