算法提高-图论- 负环

news2024/9/28 7:21:43

负环

  • 负环
    • AcWing 904. 虫洞
    • AcWing 361. 观光奶牛
    • AcWing 1165. 单词环

负环

本博客主要介绍spfa求负环
一般用第二种方法
第一种方法如果每个点入队n次,每次入队也要遍历n次,那么时间复杂度就是n2
第二种方法时间复杂度是n,只要发现最短路边数>=n就说明有环了

在这里插入图片描述

AcWing 904. 虫洞

一篇很好的博客,介绍了求负环的常用方法和原理
在这里插入图片描述

#include <iostream>
#include <cstring>

const int N = 510, M =2 * 2500 + 200 + 10;

using namespace std;

int dist[N];
int q[N], cnt[N];
bool st[N];
int h[N], ne[M], e[M], w[M], idx;

int T, n, m1, m2;

void add (int a, int b, int c)
{
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++ ;
}

bool spfa()
{
    //memset(dist, 0x3f, sizeof dist);//0x3f也可以ac啊,是因为有负环因为要判断的是负环,
                                      //如果存在负环,那么肯定存在一个点到虚拟源点的距离是负无穷,
                                      //相比于负无穷,0和正无穷都是 一个很大的值,因此这个初始化可以用来更新
    memset(dist, 0, sizeof dist);//这里dist初始化不是0x3f而是0
    memset(cnt, 0, sizeof cnt);
    memset(st, 0, sizeof st);
    //虚拟源点求负环
    int hh = 0, tt = 0;
    for (int i = 1;i <= n; i ++ )
    {
        q[tt ++ ] = i;
        st[i] = true;
    }
    
    while (hh != tt)
    {
        int t = q[hh ++ ];
        if (hh == N) hh = 0;
        st[t] = false;
        
        for (int i = h[t]; ~i; i = ne[i])
        {
            int j = e[i];               //现在农夫约翰希望能够从农场中的某片田地出发,经过一些路径和虫洞回到过去,并在他的出发时刻之前赶到他的出发地。
            if (dist[j] > dist[t] + w[i])//这里是求负环,负环对应最短路,因为走负环可以让代价减少所有求的是最短路
            {                            //而正环改变一下符号就行,正环对应最长路,因为走正环可以让代价增加
                dist[j] = dist[t] + w[i];
                cnt[j] = cnt[t] + 1;
                if (cnt[j] >= n) return true;
                if (st[j] == false) 
                {
                    q[tt ++ ] = j;
                    if (tt == N) tt = 0;
                    st[j] = true;
                }
                
            }
        }
    }
    return false;
}

int main()
{
    cin >> T;
    while (T -- )
    {
        memset(h, -1, sizeof h);
        idx = 0;
        
        cin >> n >> m1 >> m2;
        for (int i = 0; i < m1; i ++ )
        {
            int a, b ,c;
            cin >> a >> b >> c;
            add(a, b, c), add(b, a, c);
        }
        
        for (int i = 0; i < m2; i ++ )
        {
            int a, b, c;
            cin >> a >> b >> c;
            add(a, b, -c);//虫洞是单项的而且是负权值
        }
        
        if (spfa()) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}

AcWing 361. 观光奶牛

这是一个01规划 + 图论问题
在这里插入图片描述

#include <iostream>
#include <cstring>

using namespace std;

const int N = 1010, M = 5000 + 10;

int h[N], wt[M], ne[M], e[M], idx;
int q[N], cnt[N];
int  wf[N];
double dist[N];//dist要变成double!!!
bool st[N];

int n, m;

void add(int a, int b, int c)
{
    e[idx] = b, wt[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}

bool check(double mid)
{
    memset(dist, 0, sizeof dist);//这里求的是正环,因此求的是最长路,所以dist初始化为0,这和虫洞那题不一样
    memset(st, 0, sizeof st);//多次check,所以st要初始化
    memset(cnt, 0, sizeof cnt);
    
    int hh = 0, tt = 0;
    for (int i = 1; i <= n; i ++ )
    {
        q[tt ++ ] = i;
        st[i] = true;
    }
    
    while (hh != tt)
    {
        int t = q[hh ++ ];
        if (hh == N) hh = 0;
        st[t] = false;
        
        for (int i = h[t]; ~i; i = ne[i])
        {
            int j = e[i];
            if (dist[j] < dist[t] + wf[t] - mid * wt[i])//这个是由最初的公式变换来的
            {
                dist[j] = dist[t] + wf[t] - mid * wt[i];
                cnt[j] = cnt[t] + 1;
                if (cnt[j] >= n) return true;//如果mid带入能找到正环,继续找下一个正环,知道找不到正环的时候 此时mid的值才最大
                
                if (st[j] == false)
                {
                    q[tt ++ ] = j;
                    if (tt == N) tt = 0;
                    st[j] = true;
                }
            }
        }
    }
    
    return false;
}

int main()
{
    cin >> n >> m;    
    for (int i = 1; i <= n; i ++ ) cin >> wf[i];
    
    memset(h, -1, sizeof h);
    
    for (int i = 0; i < m; i ++ )
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c);
    }
    
    double l = 0, r = 1e6;//r是根据我们要的结果在一个什么范围计算出来的(1000 - 1) * 1000,所有干脆取1e6了
    while (r - l > 1e-4)//浮点数二分 + 根据经验值多判断两位的精度
    {
        double mid = (l + r) / 2;// double mid = l + r >> 1 double不能这么写
        if (check(mid)) l = mid;
        else r = mid;
    }
    
    printf("%.2lf", r);//printf("%.2lf", l)也行,因为while退出的时候l == r
}

AcWing 1165. 单词环

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

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

相关文章

城市道路路面病害检测识别分析,以RDD赛事捷克-印度-日本集成融合数据集为例,基于yolov5m模型开发构建城市道路病害检测识别系统

城市道路病害检测是最近比较热门的一个任务领域&#xff0c;核心就是迁移深度学习目前已有的研究成果来实现实时城市道路路面病害的检测识别分析&#xff0c;在我之前的很多博文中都有做过类似桥梁、大坝、基建、隧道等水泥设施裂缝裂痕等目标检测相关的项目&#xff0c;除此之…

SQL Server 2008 定时自动备份和自动删除方法

SQL Server 2008 数据定时自动备份和自动删除方法&#xff0c;同一个计划兼备数据备份数数据删除的操作方法 工具/原料 SQL Server 2008 方法/步骤 1、 点击实例名下的【管理】-【维护计划】-点击鼠标右键&#xff0c;点击【维护计划向导】&#xff0c;填写计划名称&…

崛起的中国卫浴:市场与创新双驱动

5月28日&#xff0c;国产大飞机C919完美完成了商业航班首飞。从中国制造到中国创造&#xff0c;C919的成功是无数中国企业、中国品牌的缩影。 改革开放至今的短短四十年间&#xff0c;中国经历了“以市场换技术-模仿式创新-源创新”三个阶段&#xff0c;上世纪90年代&#xff…

【IMX6ULL驱动开发学习】07.注册驱动设备_分配固定的次设备号_cdev

一、register_chrdev 在之前的hello驱动中&#xff0c;注册驱动设备的方式如下 /*初始化设备方法1&#xff1a;自动分配设备号&#xff0c;占用所有次设备号*/ major register_chrdev(0,"hello_drv",&hello_fops);使用 register_chrdev 分配设备号的方式比较…

【JAVA开发环境配置】 我也可以让JDK版本来去自由的切换了! 哈哈哈哈 舒服!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

单页面控制中心 vue-router

一、 路由的基本配置 1. 在router->index.js中&#xff0c;配置一个懒路由&#xff0c;定义页面加载哪个组件 import Vue from vue import VueRouter from vue-routerVue.use(VueRouter)const routes []// 配置一个懒路由,不然会加载页面下所有组件 const router new Vu…

基于微信小程序的失物招领系统设计与实现

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…

BI工具+方案:火速构建电商数据分析架构

电商数据分析该怎么做&#xff1f;谁都知道电商数据分析讲究效率和精细化&#xff0c;光是围绕电商销售分析&#xff0c;就需要制作包括管理驾驶舱、销售预算分析、店铺销售增长趋势、店铺排名分析、商品退货分析等近20种电商数据分析报表。怎么才能又快又好地完成智能数据分析…

java设计模式之:装饰器模式

前言 在软件设计中&#xff0c;我们也有一种类似新房装修的技术可以对已有对象&#xff08;新房&#xff09;的功能进行扩展&#xff08;装修&#xff09;&#xff0c;以获得更加符合用户需求的对象&#xff0c;使得对象具有更加强大的功能。这种技术对应于一种被称之为装饰模…

Bug序列——容器内给/root目录777权限后无法使用ssh免密登录

Linux——创建容器并将本地调试完全的前后端分离项目打包上传docker运行_北岭山脚鼠鼠的博客-CSDN博客 接着上一篇文章结尾出现403错误时通过赋予/root目录以777权限解决403错误。 chmod 777 /root 现在又出现新的问题&#xff0c;远程ssh无法免密登录了&#xff0c;即使通过…

准备了2个月,怒刷面试题,4面字节跳动,顺利拿到 offer

说到字节跳动的经历还是比较搞笑的。一开始我特别想去那个游戏测试部门&#xff0c;当然 data测试部门也是特别想去的&#xff0c;但是提前批只能投一个&#xff0c;于是投了游戏&#xff0c;结果第二天就给我挂了。。。中间北京的捞我&#xff0c;但是不想去北京所以拒绝了&am…

说透缓存击穿、穿透、雪崩及常用解决方案

文章目录 缓存击穿、穿透、雪崩及解决方案击穿、穿透、雪崩的意思缓存击穿缓存穿透缓存雪崩总结 系列文章目录 本文是系列文章&#xff0c;为了增强您的阅读体验&#xff0c;已将系列文章目录放入文章末尾。&#x1f44d;&#x1f44d;&#x1f44d; 缓存击穿、穿透、雪崩及解决…

我的内网渗透-metasploit基础

目录 MSF postgresql msf模块 永恒之蓝 木马下放 后渗透一些简单命令 MSF Msfconsole是Metasploit框架的主要控制台界面。 开源的渗透软件 postgresql 使用的是postgresql数据库&#xff08;metasploit所依载的数据库&#xff0c;没有他也可以运行metasploit框架&…

Vue中如何进行二维码生成与扫描?

Vue中如何进行二维码生成与扫描&#xff1f; 二维码是一种广泛应用于各种场合的编码方式&#xff0c;它可以将信息编码成一张二维图案&#xff0c;方便快捷地传递信息。在Vue.js中&#xff0c;我们可以使用一些库和组件来实现二维码的生成和扫描。本文将介绍如何在Vue中实现二…

高频RFID工业读写器在自动化产线上如何应用?

工业读写器在自动化生产上具有十分重要的作用&#xff0c;它可以对工业生产中的贴上RFID标签的各种零部件和产品&#xff0c;进行跟踪与识别。利用RFID技术进行非接触的物体识别和追踪&#xff0c;更好的掌握产线上的物料信息。 高频RFID工业读写器在自动化产线上如何应用&…

Android studio C++调试问题汇总

问题1&#xff1a;如下图所示&#xff0c;cpp目录不显示或cpp目录不显示C源文件。 此问题由由于abiFilter指定为armeabi&#xff0c;但armeabi架构已经不再支持的原因导致&#xff0c;将armeabi修改为armeabi-v7a或arm64等其他支持的架构即可&#xff0c;修改后如下图所示&…

致敬易语言,Excel衍生新型中文编程,Python用户:转折点到了

没有逃过被命运的捉弄 易语言作为中文编程里的老大&#xff0c;刚开始的时候&#xff0c;叫E语言。 创始人吴涛&#xff0c;地道的中国人&#xff0c;就是为了让中国人不再孜孜不倦的去追难懂的编程语言&#xff0c;降低开发门槛。 易语言的结局最终也没逃过被命运的捉弄&…

一款可以拿来做毕设的图书管理系统,简单易掌握,非常nice

项目介绍 项目简介 使用jsp、layui、mysql完成的图书馆系统&#xff0c;包含用户图书借阅、图书管理员、系统管理员界面&#xff0c;功能齐全。 项目详细介绍 本图书管理系统总体上分为前台页面显示和后台管理。 共包含三个大模块&#xff1a;用户、图书管理员、系统管理员…

全量程真空压力综合测量系统的高精度控制解决方案

摘要&#xff1a;针对工作范围在5~1.3Pa&#xff0c;控制精度在0.1%~0.5%读数的全量程真空压力综合测量系统技术要求&#xff0c;本文提出了稳压室真空压力精密控制的技术方案。为保证控制精度&#xff0c;基于动态平衡法&#xff0c;技术方案在高真空、低真空和正压三个区间内…

初识s3c2440A之ARM体系架构入门linux硬件

文章目录 前言一、环境平台的基本介绍二、ARM体系架构必备知识1. 计算机三大组成2. ARM的分类2.1 ARM Cortex-A系列2.2 ARM Cortex-R系列2.3 ARM Cortex-M系列 3. 2440ARM的系统架构 总结 前言 如果大家在前期学习了c语言&#xff0c;并且具备了一定的c语言功底&#xff0c;且学…