找环

2023-11-12

找环

1.算法分析

1.1 判断是否存在环

如果是无向图,那么可以使用:

  1. 并查集判断是否存在环(并查集不仅能够判断是否存在环,还能判断是否存在奇环)
  2. 使用dfs打标记的方法判断是否存在环。
  3. tarjan缩点的方式判断是否存在双连通分量,如果存在必然存在环
  4. spfa判断是否存在环

如果是有向图,那么可以使用:

  1. dfs打标记的方法判断是否存在环
  2. tarjan缩点的方式判断是否存在强连通分量,如果存在必然存在环
  3. spfa判断是否存在环

特殊环判定:

  1. 奇环:并查集判定、染色法判断(是否为二分图)

  2. 正环、负环:spfa判断、tarjan缩点判定

1.2 找出所有环上的所有点

无向图:

  1. dfs打标记的方式找环,找到的是否记录pre数组,表示当前点的前一个点是哪个
  2. tarjan缩点后双连通分量就是多个环的并
  3. spfa记录pre数组打印环

有向图:

  1. dfs打标记的方法找环,使用pre数组记录
  2. tarjan缩点后强连通分量就是多个环的并
  3. spfa记录pre数组打印环

注意:

dfs和spfa使用pre数组找到的环,都是一个简单环

1.3 类拓扑排序找出与度数有关的点集->退化到度数为2的环

可以使用类似拓扑排序的方法找到一个点集,使得点集在任意一个点的度都大于等于k。如果k=2,那么就是一个环。

1.4 找到以s为源点的最小环

对spfa算法进行修改可以完成这个操作: O ( k m ) O(km) O(km)

1.5 floyd找到有向图/无向图的最小环

floyd+dp可以找到有向图/无向图的最小环: O ( n 3 ) O(n^3) O(n3)

2.模板

2.1 判断是否存在环

具体见 并查集、强连通分量、双连通分量、匹配问题

2.2 找出所有环上的所有点

维护pre数组,倒着找就行

2.3 类拓扑排序找出与度数有关的点集->退化到度数为2的环

见3.3

2.4 找到以s为源点的最小环

枚举版本

// spfa求最短路且找到以s为起点回到s的最小环
// 最后找到的最小环大小为dis[s]
void spfa(int s) {
   
    queue<int> q;  // 建立新队列
    for (int i = 1; i <= n; ++i) {
   
        st[i] = 0;
        if (i == s) dis[i] = INF;  // 初始化要求最小环的点
        else {
   
            dis[i] = mp[s][i];
            st[i] = 1;
            q.push(i);
        }
    }
    
    while (q.size()) {
   
        auto t = q.front();  
        q.pop();  // 队首元素出队
        st[t] = 0;  // 记录出队

        for (int i = 1; i <= n; ++i) {
   
            if (dis[i] > dis[t] + mp[t][i]) {
   
                dis[i] = dis[t] + mp[t][i];
                if (!st[i]) {
     // 如果j点不在队列里
                    q.push(i);  // 入队
                    st[i] = 1;  // 记录
                }
            }
        }
    }
}

链式前向星版本

int spfa(int s) {
   
    queue<int> q;  // 建立新队列
    for (int i = 1; i <= n; ++i) {
   
        st[i] = 0;
        if (i == s) dis[i] = INF;  // 初始化要求最小环的点
        else {
   
            if (mp[s][i] == 1) dis[i] = 1, pre[i] = s;  // 如果s和i点有边的话,这里记录pre数组还能够找到这个最小的环是什么
            else dis[i] = INF;  // 如果没有边
            st[i] = 1;
            q.push(i);
        }
    }

    while (q.size()) {
   
        auto t = q.front();
        q.pop();    // 队首元素出队
        st[t] = 0;  // 记录出队

        for (int i = h[t]; ~i; i = ne[i]) {
   
            int j = e[i];
            if (dis[j] > dis[t] + 1) {
   
                dis[j] = dis[t] + 1;
                pre[j] = t;
                if (!st[j]) {
   
                    q.push(j);
                    st[j] = 1;
                }
            }
        }
    }
    return dis[s];
}

2.5 floyd找最小环

3.典型例题

3.1 类拓扑排序找出与度数有关的点集->退化到度数为2的环

CF 1440D.Graph Subset Problem

题意: 给定一张n个点m条边的图,问是否能够找到一个点集,点集中每个点的度都大于等于k。问是否能够找到一个团&#

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

找环 的相关文章

  • C语言学习打卡11.22

    上一周学习内容 函数 初学函数笔记 返回类型 一个函数可以返回一个值 return type 是函数返回的值的数据类型 有些函数执行所需的操作而不返回值 在这种情况下 return type 是关键字 void 函数名称 这是函数的实际名称
  • Windows提权基本原理

    前言 没有多少人谈论在Windows下提权 是一件让人遗憾的事 我想 没有人这么做的理由有以下几点 在渗透测试项目中 客户需要的验证就是一个低权限shell 在演示环境 你经常就会得到管理员帐户 meterpreter使你变得懒惰 gets
  • Angular4.0_依赖注入简介

    什么是依赖注入模式及使用依赖注入的好处 依赖注入 Dependency Injection 简称DI var product new Product createShipment product 我们new一个对象实例 然后当做参数传递给c
  • C++ 实现 redis 发布订阅 --- 使用 hiredis 同步API(一)

    ubuntu18 04安装redis 方法一 使用ubuntu官方软件库安装redis 1 获取最新的软件包 sudo apt update 2 安装redis sudo apt install redis server 3 查看是否安装好
  • Web安全之SQL注入漏洞学习(七)-堆叠注入

    堆叠注入简介 堆叠注入是指注入的多条SQL语句可以一起执行 MySQL命令行中 每一条语句结尾加 表示语句结束 这样是不是可以多句一起使用 这个叫做 stacked injection 堆叠注入原理 局限性 原理 在MySQL的SQL语法中
  • 华硕电脑怎么录屏?分享实用录制经验!

    华硕电脑怎么录屏呀 刚买的笔记本电脑 是华硕的 自我感觉挺好用的 但是不知道怎么录屏 最近刚好要录一个教程 怎么都找不到在哪里录制 有人能教教我吗 随着电脑技术的不断发展 人们越来越依赖电脑进行工作和娱乐 录屏功能作为电脑的一项重要功能 已
  • 华为OD机试 C++ 【报文重排序】

    题目 你手里有一堆乱七八糟的消息片段 每个片段后面都跟着一个数字 那个数字就像是每个片段的编号 你需要按照这些数字 将消息片段整合成一个完整的消息 并把那些数字扔掉 输入 第一行告诉你有几个消息片段 记作N 0 lt N 1000 第二行就
  • Axure rp9 学习笔记-进度笔记以及问题整理

    Axure rp9 学习笔记 进度笔记以及问题整理 4 15 iphone 原型设计 遇到问题 1 苹果手机左按键画的过程中没有弧度 corner 选项为灰 没法选 2 将绘制好的iphone 原型图设置成母版以后 却无法更改颜色 我们对M
  • Rust vs Go:常用语法对比(八)

    题目来自 Golang vs Rust Which Programming Language To Choose in 2023 1 141 Iterate in sequence over two lists Iterate in seq
  • 【LeetCode 热题 HOT 100-002】两数相加(python)

    题集链接 https leetcode cn problem list 2cktkvj 题目链接 https leetcode cn problems add two numbers favorite 2cktkvj 一 题目 二 代码 解
  • C# winform Panel 获取滚轮事件

    使用 Panel 做为控件容器时 设置 Panel AutoScroll true时 在适当的时候将会出现滚动条 但是只能通过拖动滚动条来调整滚动条的位置 如果想要用鼠标中间键来控制滚动条的位置 可以通过下面几步来完成 1 在构造函数中加上
  • DCGAN、WGAN、WGAN-GP、LSGAN、BEGAN原理总结及对比

    GAN系列学习 2 前生今世 本文已投稿至微信公众号 机器学习算法工程师 欢迎关注 本文是GAN系列学习 前世今生第二篇 在第一篇中主要介绍了GAN的原理部分 在此篇文章中 主要总结了常用的GAN包括DCGAN WGAN WGAN GP L
  • 记一次Vulnstack靶场内网渗透(五)

    实验环境搭建 VMware新建网卡VMnet14 选择仅主机模式 并将网段IP设置为192 168 138 0 然后将Windows 7和Windows 2008绑在这个VMnet14上 除此之外 还需要给Windows 7 新增一个网卡
  • C#实现俄罗斯方块游戏

    还记得小时候经常拿袖珍电子游戏机或者小霸王玩过最多的就是俄罗斯方块 冒险岛 超级玛丽还有魂斗罗之类的 这些游戏由于其中简单易上上手的特点 曾经风靡了全世界 俄罗斯方块的基本规则是移动 旋转和摆放游戏自动输出的各种方块 使之排列成完整的一行或
  • Linux开机&关机

    走进Linux系统 开机登录 开机会启动许多程序 它们在Windows叫做 服务 service 在Linux就叫做 守护进程 daemon 开机成功后 它会显示一个文本登录界面 这个界面就是我们经常看到的登录界面 在这个登录界面会提示用户
  • 关于String内存分配的深入探讨

    2019独角兽企业重金招聘Python工程师标准 gt gt gt public class Test public static final String MESSAGE taobao public static void main St
  • Sqli-labs之Less-34

    Less 34 基于错误 POST 单引号 字符型 addslashes 宽字节注入 这一关是POST型的注入 同样的将post传递过来的内容进行了转义处理 过滤了单引号 反斜杠 有之前的例子我们可以看到 df可以将转义的反斜杠给吃掉 而G
  • 数据结构 十进制和十六进制进制间的相互转换

    一 十进制转十六进制 例题 输入十进制数 654321 输出十六进制数 9FBF1 解题步骤 十进制数对16取余 因为最终结果是从下往上依次书写 说以我们可以利用栈的特性 先进 的后出 将余数存入栈中依次弹出 再将弹出的数进行拼接输出即可
  • C++迭代器-------array的基本用法总结

    基本用法中主要总结有 遍历和比较大小 注意 加上头文件 include

随机推荐

  • 利用python来制作动态二维码

    前言 为什么要学习python 是因为不仅很多工作需要用到python 同时我们可以利用python做很多好玩儿的事儿 今天就来教大家如何利用python制作动态二维码 代码说明 我们以小猪佩奇gif图片为例 如果我们利用的背景图是gif动
  • 工厂实施MES系统可以带来哪些效益?

    众多工厂生产现状 1 设施设备先进 但是管理方式落后 手工管理模式的存在 造成数据的不准确和不完全 没有完全实现信息化管理 2 生产计划协调性差 作业调度困难 生产作业计划主要依据调度员的经验制定 设备利用率低 任务进度监控难 紧急插单普遍
  • C++虚基类

    问题引出 问题 A中数据 在D中保存了两份 虚继承 虚继承的目的是让某个类做出声明 承诺愿意共享它的基类 其中 这个被共享的基类就称为虚基类 Virtual Base Class 虚派生只影响从指定了虚基类的派生类中进一步派生出来的类 它不
  • 扎心!为何HR看了你的简历却不通知面试?

    还只是老老实实地写简历 投简历 默默地等待面试通知 那只有两种可能 你太天真 或者是 你真的很久没有 求职 了 如果你细心观察会发现 当你完成一份简历之后 它的状态也会有变化 然而 却有很多求职者并没有搞清楚这些 状态 到底代表着什么 但小
  • idea 配置 JavaWeb 项目的 tomcat

    目录 第一步 单击 idea 靠右上部位的 添加配置 Add Config Run Config 第二步 点击 添加新 或者图中箭头指向的任意一个地方 第三步 选择 Tomcat 服务器 本地 不是 TomEE 第四步 若以前从未配置 To
  • 使用SARIMA做季节时间序列预测全流程(附MATLAB代码)

    在之前的专栏中我们用ARIMA的方法做了时间序列的趋势性预测 不过我们经常还会遇到一种情况 即某些时间序列中存在明显的周期性变化 这种周期是由于季节性变化 季度 月度等 引起的 如下图所示 为1949年到1960年每月国际航空公司的乘客人数
  • C# pdf文件加数字证书,防篡改

    C 指定文件夹内新创建pdf文件加签数字证书 代码实现 引用 Spire Pdf string files Directory GetFiles Config pdfPath 需加数字证书pdf存放文件夹地址 string filesLis
  • 进程信号生命周期详解

    信号和信号量半毛钱关系都没有 每个信号都有一个编号和一个宏定义名称 这些宏定义可以在signal h中找到 例如其中有定 义 define SIGINT 2 查看信号的机制 如默认处理动作man 7 signal SIGINT的默认处理动作
  • c++自定义类型和预处理

    struct 内部初始化变量时 不能用 struct data int x 12 float f 122 5f int pi x data da cout lt lt da f lt lt endl data dap new data 使用
  • 配置 nginx 遇到错误排查(初级)

    系统版本 ubuntu 14 04 nginx 版本 nginx 1 4 6 Ubuntu 本文不是一步步搭建 nginx 的过程 而是我在使用 nginx 的过程中 整理自己遇到的的一些问题 适用于 nginx 遇到问题 排查问题的 ch
  • Neo4J 初次启动与密码

    初次安装成功Neo4J在安装的文件中会有一个bin文件夹 powershell进入bin文件夹执行 neo4j sonsole会有以下结果 D neo4j bin gt neo4j console 2020 09 04 00 57 31 0
  • Python基于PyTorch实现卷积神经网络分类模型(CNN分类算法)项目实战

    说明 这是一个机器学习实战项目 附带数据 代码 文档 视频讲解 如需数据 代码 文档 视频讲解可以直接到文章最后获取 1 项目背景 卷积神经网络 简称为卷积网络 与普通神经网络的区别是它的卷积层内的神经元只覆盖输入特征局部范围的单元 具有稀
  • oracle 9i在线重定义,在oracle 9i下在线重定义表

    9i提供了联机重定义表的方法 可以让你在基本不影响原表的DML情况下修改表结构 实际上 联机重定义表并不是完全的联机重定义 在最后交换表名的时候会短暂地锁定原表和中间表 但这个过程很短暂 相对于传统方法来说 这是一个进步 9i提供了联机重定
  • CNN、BiGRU、BiLSTM代码

    toxicCommentsclassification BiLSTMAttentionNetwork py at master AmritSatpathy toxicCommentsclassification GitHubtoxic co
  • BlueStore 架构及原理分析

    BlueStore 架构及原理分析 Ceph 底层存储引擎经过了数次变迁 目前最常用的是 BlueStore 在 Jewel 版本中引入 用来取代 FileStore 与 FileStore 相比 Bluesore 越过本地文件系统 直接操
  • 算法训练营第四十一天(9.2)

    Leecode 1143 最长公共子序列 题目地址 力扣 LeetCode 官网 全球极客挚爱的技术成长平台 题目类型 最长子序列 class Solution public int longestCommonSubsequence str
  • cython代码编译和setup.py文件编写

    Cython 官方文档 https cython readthedocs io en latest 中文文档 https www bookstack cn read cython doc zh https cython apachecn o
  • visjs DataSet支持的数据类型和选择

    数据类型 DataSet 支持以下数据类型 Name Description Examples Boolean A JavaScript Boolean true false Number A JavaScript Number 32 2
  • MFC的ActiveX控件 - 1

    转自 https blog csdn net babykangaroo article details 45795079 本文是入门学习ActiveX的学习笔记 属于系统学习整个框架部分 具体细节自己写代码时再深入 学习参考书籍是 MFC
  • 找环

    文章目录 找环 1 算法分析 1 1 判断是否存在环 1 2 找出所有环上的所有点 1 3 类拓扑排序找出与度数有关的点集 gt 退化到度数为2的环 1 4 找到以s为源点的最小环 1 5 floyd找到有向图 无向图的最小环 2 模板 2