有向图查询所有环,非递归

图:
在这里插入图片描述

有向图查询所有环,非递归:

import java.util.*;

public class CycleTest {
    private final int V; // 顶点数
    private final List<List<Integer>> adjList; // 邻接表

    public CycleTest(int vertices) {
        this.V = vertices;
        this.adjList = new ArrayList<>(vertices);
        for (int i = 0; i < vertices; i++) {
            adjList.add(new LinkedList<>());
        }
    }

    // 添加有向边
    public void addEdge(int src, int dest) {
        adjList.get(src).add(dest);
    }

    // 查找所有环
    public List<List<Integer>> findAllCycles() {
        List<List<Integer>> cycles = new ArrayList<>();
        Stack<Integer> stack = new Stack<>();
        Stack<Integer> pathStack = new Stack<>();
        Stack<Integer> neighborPoint = new Stack<>();
        Stack<Integer> levelStack = new Stack<>();
        boolean[] visited = new boolean[V];
        int level = 1;

        for (int startVertex = 0; startVertex < V; startVertex++) {
            if (visited[startVertex]) {
                continue;
            }
            stack.push(startVertex);
            pathStack.push(startVertex);

            while (!stack.isEmpty() || !neighborPoint.isEmpty()) {
                if (stack.isEmpty()) {
                    int l = levelStack.pop();
                    // 返回上一个邻接点搜索
                    Integer p = neighborPoint.pop();
                    stack.push(p);
                    while (pathStack.size() >= l) {
                        pathStack.pop();
                    }
                    pathStack.push(p);
                    level--;
                }
                int vertex = stack.pop();

                List<Integer> neighbors = adjList.get(vertex);
                for (int i = 0; i < neighbors.size(); i++) {
                    Integer neighbor = neighbors.get(i);
                    if (i == 0) {
                        if (!pathStack.contains(neighbor)) {
                            stack.push(neighbor);
                            pathStack.push(neighbor);
                        } else {
                            // 找到环
                            List<Integer> cycle = new ArrayList<>();
                            List<Integer> path = pathStack.stream().toList();
                            for(int j = path.size() - 1; j >= 0; j--) {
                                Integer p = path.get(j);
                                cycle.add(p);
                                visited[p] = true;
                                if (Objects.equals(p, neighbor)) {
                                    break;
                                }
                            }
                            Collections.reverse(cycle);
                            cycles.add(cycle);
                        }
                        level++;
                    } else {
                        // 存储邻接点
                        neighborPoint.push(neighbor);
                        levelStack.push(level);
                    }
                }
            }

            // 清除路径栈状态
            pathStack.clear();
            levelStack.clear();
            level = 1;
        }

        return cycles;
    }

    public static void main(String[] args) {
        CycleTest graph = new CycleTest(4);
        graph.addEdge(0, 1);
        graph.addEdge(1, 2);
        graph.addEdge(2, 0);
        graph.addEdge(1, 3);
        graph.addEdge(3, 2);

        List<List<Integer>> cycles = graph.findAllCycles();

        System.out.println("Cycles in the directed graph:");
        for (List<Integer> cycle : cycles) {
            System.out.println(cycle);
        }
    }
}

结果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

etcd自动化安装配置教程

文章目录 前言一、简介1. 简介2. 特点3. 端口介绍 二、etcd安装教程&#xff08;单机版&#xff09;1. 复制脚本2. 增加执行权限3. 执行脚本4. 查看启动状态5. 卸载etcd 三、etcd安装教程&#xff08;集群版&#xff09;1. 复制脚本2. 增加执行权限3. 分发脚本4. 执行脚本5. 启…

【Linux】yum与vim命令详解

&#x1f497;个人主页&#x1f497; ⭐个人专栏——Linux学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读1. yum命令1.1 基本使用1.2 注意事项1.3 lrzsz软件包示例 2. vim命令2.1 vim的基本概念2.2 vim配置2.3 vim的基本操作2.3…

归并排序+非比较排序

Hello everyone&#xff01;欢迎来到排序章节目前的“终章”——归并排序&#xff0c;经过了前面三种排序的敲打&#xff0c;尤其是快速排序&#xff0c;相信你一定可以闯过这最后一关&#xff01; 归并排序 基本思想&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff09;…

Idea编写mapper.xml文件提示表名和字段

一、连接database 二、setting- > language -> sql Dialects中 的选项设为 mysql就可以了 三、测试

CS144--Chapter0--wsl2+docker环境搭建

我的笔记本配置 荣耀magicbook16&#xff0c;容量是500G&#xff0c;芯片是R7-5800 由于笔记本容量较小&#xff0c;因此考虑这个方案&#xff0c;对于台式机用户&#xff0c;建议可以直接用虚拟机或者双系统。 前言 斯坦福官网给出的方法是用他们的镜像&#xff08;基于Ubu…

Android 12 系统开机动画

修改Android开机动画有两种方式 方式一、通过adb 命令来修改&#xff1a; 进入/system/media目录&#xff0c;将里面的 bootanimation.zip 文件pull出来&#xff0c;然后解压&#xff0c;替换part0和part1中的图片&#xff0c;并且根据图片大小修改文件 desc.txt 中的内容&…

跳跃表解决01背包问题

跳跃表解决01背包问题 挺有意思的题目 看算法设计与分析有跳跃点实现&#xff0c;解决空间复杂度&#xff0c;感觉好烧脑&#xff0c;就实现了一下 结果 代码 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices.C…

第十篇【传奇开心果短博文系列】鸿蒙开发技术点案例示例:深度解读鸿蒙全场景适配

传奇开心果短博文系列 系列短博文目录鸿蒙开发技术点案例示例系列 短博文目录前言一、鸿蒙全场景适配实现介绍二、统一核心示例代码三、设备驱动框架示例代码四、统一界面框架示例代码五、自适应布局示例代码六、分布式能力示例代码七、跨平台开发示例代码八、设备能力开放示例…

AP6317 同步3A锂电充电IC 带散热 便携式设备 充电器

概述是一款面向5V交流适配器的3A锂离子电池充电器。它是采用800KHz固定频率的同步降压型转换器&#xff0c;因此具有高达92%以上的充电效率&#xff0c;自身发热量极小。包括完整的充电终止电路、自动再充电和一个度达1%的4.2V预设充电电压&#xff0c;内部集成了防反灌保护、输…

使用ChatGPT学习大象机器人六轴协作机械臂mechArm

引言 我是一名机器人方向的大学生&#xff0c;近期学校安排自主做一个机器人方面相关的项目。学校给我们提供了一个小型的六轴机械臂&#xff0c;mechArm 270M5Stack&#xff0c;我打算使用ChatGPT让它来辅助我学习如何使用这个机械臂并且做一个demo。 本篇文章将记录我是如何使…

jsp 产品维修管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 产品维修管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.…

【51单片机系列】应用设计——8路抢答器的设计

51单片机应用——8路抢答器设计 文章设计文件及代码&#xff1a;资源链接。 文章目录 要求&#xff1a;设计思路软件设计仿真结果 要求&#xff1a; &#xff08;1&#xff09; 按下”开始“按键后才开始抢答&#xff0c;且抢答允许指示灯亮&#xff1b; &#xff08;2&…

2024年第七届亚洲能源与电气工程会议 (ACEEE 2024)

2024年第七届亚洲能源与电气工程会议 (ACEEE 2024)将于2024年7月20-22日在中国成都举行。本次会议由电子科技大学主办&#xff0c;电子科技大学机械与电气工程学院承办。ACEEE 2024旨在为推动能源与电气工程领域科学研究的发展&#xff0c;增进各国学者之间的学术交流&#xff…

备战蓝桥杯---数据结构与STL应用(进阶1)

让我们先来看一看map的基础应用吧&#xff1a; 下面是实现代码&#xff1a; #include<bits/stdc.h> using namespace std; typedef map<int,multiset<int> > line; map<int,multiset<int> >mx; map<int,multiset<int> >my; int n,m…

《Docker技术革命:从虚拟机到容器化,全面解析Docker的原理与应用-上篇》

文章目录 Docker为什么会出现总结 Docker的思想Docker历史总结 Docker能干嘛虚拟机技术虚拟机技术的缺点 容器化技术Docker和虚拟机技术的区别 Docker概念Docker的基本组成镜像&#xff08;image)容器&#xff08;container&#xff09;仓科&#xff08;repository&#xff09;…

Vulnhub靶机:hackme2-DHCP

一、介绍 运行环境&#xff1a;Virtualbox(攻击机)和VMware(靶机) 攻击机&#xff1a;kali&#xff08;192.168.56.106&#xff09; 靶机&#xff1a;hackme2-DHCP&#xff08;192.168.56.107&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1…

【lesson31】MySQL视图

文章目录 视图介绍基本使用创建视图案例删除视图 视图规则和限制 视图介绍 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 基本使用…

GitLab16.8配置webhooks、Jenkins2.4配置GitLab插件实现持续集成、配置宝塔面板实现持续部署(其三)

看本篇文章的前提是已经部署完GItlab和Jenkins服务器&#xff0c;已经可以手动构建成功&#xff0c;并且经过了很多次实践&#xff0c;对这两款软件基本熟悉。 建议大家按以下顺序看 前端自动化&#xff08;其一&#xff09;部署gitlab 前端自动化&#xff08;其二&#xff0…

百无聊赖之JavaEE从入门到放弃(十四)异常

目录 一.异常机制 二.异常分类 三.异常的处理方式 1.捕获异常(try-catch-finally) 2.声明异常&#xff08;throws 子句&#xff09; 四.try-with-resource 五.自定义异常 六.IDEA 调试 debug 一.异常机制 工作中&#xff0c;程序遇到的情况不可能完美。比如&#xff1a…

Zabbix数据库分离与邮件报警

基础环境&#xff1a;要有zabbix服务端与被监控端实验目标&#xff1a;源数据库与服务端存放在一台服务器上&#xff0c;分离后源数据库单独在一台服务器上&#xff0c;zabbix服务端上不再有数据库。环境拓扑图&#xff1a; 实验步骤&#xff1a; 1.在8.7服务器上安装相同版本…