SPFA找负环

2024-01-31(最短路径)-CSDN博客

   求负环的常用方法,基于spfa:

1.统计每个点入队的次数,如果有个点入队n次,则说明存在负环

2.统计当前每个点的最短路中包含的边数,如果某个点的最短路的所包含的边数大于等于         n,则说明也存在环 

当所有点的入队次数大于2n时,我们就认为图中有很大的可能是存在负环的 

(如果TLE了,那么可以把队列换成栈来试一下)

904. 虫洞 - AcWing题库

裸题 

import java.util.*;

public class Main{
    static int N = 510, M = 5500;
    static int n, m1, m2, idx;
    static int[] h = new int[N], e = new int[M], ne = new int[M], w = new int[M];
    static int[] dist = new int[N];
    static boolean[] st = new boolean[N];
    static int[] cnt = new int[M];//边数
    
    public static void add(int a, int b, int c){
        e[idx] = b;
        w[idx] = c;
        ne[idx] = h[a];
        h[a] = idx ++;
    }
    
    public static boolean spfa(){
        Arrays.fill(dist, 0);
        Arrays.fill(st, false);
        Arrays.fill(cnt, 0);
        
        Queue<Integer> q = new LinkedList<>();//循环队列
        
        for(int i = 1; i <= n; i ++){//每个点入队
            q.offer(i);
            st[i] = true;
        }
        
        while(!q.isEmpty()){
            int t = q.poll();
            st[t] = false;
            
            for(int i = h[t]; i != -1; 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]){
                        q.offer(j);
                        st[j] = true;
                    }
                }
            }
        }
        return false;
    }
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        while(T -- > 0){
            n = sc.nextInt();
            m1 = sc.nextInt();
            m2 = sc.nextInt();
            
            Arrays.fill(h, -1);
            idx = 0;//一定要记得!!!
            
            while(m1 -- > 0){
                int a = sc.nextInt();
                int b = sc.nextInt();
                int c = sc.nextInt();
                add(a, b, c);
                add(b, a, c);
            }
            
            while(m2 -- > 0){
                int a = sc.nextInt();
                int b = sc.nextInt();
                int c = sc.nextInt();
                add(a, b, -c);//虫洞的通道是单向的
            }
            
            if(spfa()) System.out.println("YES");
            else System.out.println("NO");
        }
    }
}

361. 观光奶牛 - AcWing题库

01分数规划:二分 -> 整理不等式 -> 重新定义边权 -> 判断图中是否存在正环

import java.util.*;

public class Main{
    static int N = 1010, M = 5010;
    static int n, m, idx;
    static int[] wd = new int[N];//点权
    static int[] h = new int[N], e = new int[M], ne = new int[M], wb = new int[M];//边权
    static double[] dist = new double[N];
    static int[] cnt = new int[N];
    static boolean[] st = new boolean[N];
    
    public static void add(int a, int b, int c){
        e[idx] = b;
        wb[idx] = c;
        ne[idx] = h[a];
        h[a] = idx ++;
    }
    
    public static boolean spfa(double x){
        Arrays.fill(dist, 0);
        Arrays.fill(st, false);
        Arrays.fill(cnt, 0);
        
        Queue<Integer> q = new LinkedList<>();
        
        for(int i = 1; i <= n; i ++){
            q.offer(i);
            st[i] = true;
        }
        
        while(!q.isEmpty()){
            int t = q.poll();
            st[t] = false;
            
            for(int i = h[t]; i != -1; i = ne[i]){
                int j = e[i];
                if(dist[j] < dist[t] + wd[t] - x * wb[i]){
                    dist[j] = dist[t] + wd[t] - x * wb[i];
                    cnt[j] = cnt[t] + 1;
                    
                    if(cnt[j] >= n) return true;
                    
                    if(!st[j]){
                        q.offer(j);
                        st[j] = true;
                    }
                }
            }
        }
        return false;
    }
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        Arrays.fill(h, -1);
        
        for(int i = 1; i <= n; i ++){
            wd[i] = sc.nextInt();
        }
        
        for(int i = 0; i < m;  i ++){
            int a = sc.nextInt();
            int b = sc.nextInt();
            int c = sc.nextInt();
            add(a, b, c);
        }
        
        //二分
        double l = 0, r = 1010;
        while(r - l > 1e-4){
            double mid = (l + r) / 2;
            if(spfa(mid)) l = mid;
            else r = mid;
        }
        
        System.out.printf("%.2f", l);
    }
}

1165. 单词环 - AcWing题库

这道题就用到了前面说的技巧 

import java.util.*;

public class Main{
    static int N = 700, M = 100010;
    static int n, idx;
    static int[] h = new int[N], e = new int[M], ne = new int[M], w = new int[M];
    static int[] cnt = new int[N];
    static boolean[] st = new boolean[N];
    static double[] dist = new double[N];
    
    public static void add(int a, int b, int c){
        e[idx] = b;
        w[idx] = c;
        ne[idx] = h[a];
        h[a] = idx ++;
    }
    
    public static boolean check(double x){
        Arrays.fill(st, false);
        Arrays.fill(dist, 0);
        Arrays.fill(cnt, 0);
        int count = 0;
        
        Queue<Integer> q = new LinkedList<>();
        
        for(int i = 0; i < 676; i ++){
            q.offer(i);
            st[i] = true;
        }
        
        while(!q.isEmpty()){
            int t = q.poll();
            st[t] = false;
            
            for(int i = h[t]; i != -1; i = ne[i]){
                int j = e[i];
                if(dist[j] < dist[t] + w[i] - x){
                    dist[j] = dist[t] + w[i] - x;
                    cnt[j] = cnt[t] + 1;
                    
                    if(++ count > 10000) return true;
                    if(cnt[j] >= N) return true;
                    
                    if(!st[j]){
                        q.offer(j);
                        st[j] = true;
                    }
                }
            }
        }
        return false;
    }
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        while(true){
            n = sc.nextInt();
            if(n == 0) break;
            
            Arrays.fill(h, -1);
            idx = 0;
            
            for(int i = 0; i < n; i ++){
                String str = sc.next();
                int len = str.length();
                if(len < 2) continue;
                
                //转化为26进制数
                int left = (str.charAt(0) - 'a') * 26 + (str.charAt(1) - 'a');
                int right = (str.charAt(len - 2) - 'a') * 26 + (str.charAt(len - 1) - 'a');
                add(left, right, len);
            }
            
            if(!check(0)){
                System.out.println("No solution");
                continue;
            }
            else{
                double l = 0, r = 1000;
                while(r - l > 1e-4){
                    double mid = (l + r) / 2;
                    if(check(mid)) l = mid;
                    else r = mid;
                }
                System.out.printf("%.2f\n", r);
            }
        }
    }
}

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

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

相关文章

2024年新版CMS内容管理使用,不用回退老版本 使用最新小程序云开发cms内容模型

一&#xff0c;问题描述 最近越来越多的同学找石头哥&#xff0c;说cms用不了&#xff0c;其实是小程序官方最近又搞大动作了&#xff0c;偷偷的升级的云开发cms&#xff08;内容管理&#xff09;以下都称cms&#xff0c;不升级不要紧&#xff0c;这一升级&#xff0c;就导致我…

uniapp列表进入动画

一、目前使用的是uni-list-chat的uniapp组件,可以自己定义的样式 <template><view class="container"><uni-list-chat title="uni-app" avatar="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/unicloudlogo.png"note=&quo…

Linux 网络监控工具

企业依靠其网络基础设施向客户和最终用户提供数字服务&#xff0c;这些环境包括 Windows 和 Linux 网络设备。与 Windows 网络相比&#xff0c;带有 GUI 的 Windows 网络相对易于管理&#xff0c;而 Linux 网络提供了更大的灵活性和高级级别的自定义。 由于操作系统有助于部署…

mysql中两千万大表做时间范围查询很慢,怎么解决

预备知识 1、一个表的数据量达到好几千万或者上亿时&#xff0c;加索引的效果没那么明显啦。性能之所以会变差&#xff0c;是因为维护索引的B树结构层级变得更高了&#xff0c;查询一条数据时&#xff0c;需要经历的磁盘IO变多&#xff0c;因此查询性能变慢。 少量数据可以考…

Day16:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

目录 前置知识 指纹识别-本地工具-GotoScan&#xff08;CMSEEK&#xff09; Python-开发框架-Django&Flask PHP-开发框架-ThinkPHP&Laravel&Yii Java-框架组件-Fastjson&Shiro&Solr&Spring 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/…

wy的leetcode刷题记录_Day83

wy的leetcode刷题记录_Day83 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2024-3-8 前言 目录 wy的leetcode刷题记录_Day83声明前言2834. 找出美丽数组的最小和题目介绍思路代码收获 328. 奇偶链表题目介绍思路代码收获 355. 设计推特…

基于SpringBoot的校友会设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 MySQL 3 1.2 SSM框架 3 1.2.1 SpringBoot 3 1.2.2 Spring 4 1.2.3 MyBatis 5 1.3 B/S架构 5 1.4 本章小结 6 2 系统分析 7 2.1 用例分析 7 2.2 功能需求 9 2.3 非功能需求 10 2.4 本章小结 10 3 系统设计 11 3.1 系统概要…

最新 11 款最佳 Android 数据恢复软件/工具

高效的 Android 恢复应用程序使用户能够轻松检索丢失或删除的手机数据&#xff0c;即使没有事先备份。因此&#xff0c;Android用户必须购买一个或多个数据恢复应用程序来应对不可预见的情况。 那么&#xff0c;哪个工具可以成为你的救星呢&#xff1f;为了帮助您选择最令人钦…

JavaWeb Tomcat启动、部署、配置、集成IDEA

web服务器软件 服务器是安装了服务器软件的计算机&#xff0c;在web服务器软件中&#xff0c;可以部署web项目&#xff0c;让用户通过浏览器来访问这些项目。 Web服务器是一个应用程序&#xff08;软件&#xff09;&#xff0c;对HTTP协议的操作进行封装&#xff0c;使得程序…

每日一题——LeetCode1624.两个相同字符之间的最长子字符串

方法一 直接遍历 保存每种字符首次出现的位置&#xff0c;再碰到这个字符时用它的当前位置减去首次出现的位置得到的长度与最大长度进行比较 var maxLengthBetweenEqualCharacters function(s) {const firstIndex new Array(26).fill(-1);let maxLength -1;for (let i 0;…

StableDrag:一种基于Diffusion模型的图像编辑,可一键拖拽生成,DragGAN被革新了!

还记得DragGAN吗&#xff1f;可以拖动锚点进行图像编辑&#xff0c;当时代码发布以后大家发现生成速度慢&#xff0c;而且不能自己自定义外部图片就没人理了。 现在又有一个StableDrag&#xff0c;是基于Diffusion 模型的&#xff0c;也可以完成类似的拖动锚点编辑图片的能力。…

如何使用apk2url从APK中快速提取IP地址和URL节点

关于apk2url apk2url是一款功能强大的公开资源情报OSINT工具&#xff0c;该工具可以通过对APK文件执行反汇编和反编译&#xff0c;以从中快速提取出IP地址和URL节点&#xff0c;然后将结果过滤并存储到一个.txt输出文件中。 该工具本质上是一个Shell脚本&#xff0c;专为红队…

从2个角度来简单讨论一下伦敦金走势图怎么看

进入伦敦金市场之后&#xff0c;投资者无时无刻都在思考着一个问题&#xff0c;那就是伦敦金走势怎么看&#xff1f;关于这个问题&#xff0c;其实在市场中有很多的文章和视频去介绍&#xff0c;在书店里也有很多投资前贤所写的书籍讨论过这个问题。但是他们都有一个特征&#…

基于Web的skc分类管理系统

目 录 摘 要 I Abstract II 引 言 1 第1章 开发目的 3 1.1 开发背景 3 1.2 开发内容 3 1.3 本章小结 4 第2章 主要技术和工具介绍 5 2.1 JSP语言简介 5 2.2 MySQL数据简介 5 2.3 SSM框架简介 6 2.4 本章小结 6 第3章 系统分析 7 3.1 可行性分析 7 3.1.1 经济可行性分析 7 3.1.…

graylog API 弱密码

graylog web 页面密码设置 输入密码&#xff1a;获取sha256加密后密码 echo -n "Enter Password: " && head -1 </dev/stdin | tr -d \n | sha256sum | cut -d" " -f1vi /etc/graylog/server/server.conf #修改以下配置 root_usernameroot ro…

算法---双指针-4(盛水最多的容器)

题目 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;盛水最多的容器 2. 讲解算法原理 算法的主要思路是使用双指针的方法&#xff0c;通过不断调整指针的位置来计算面积&#xff0c;并更新最大面积。具体步骤如下&#xff1a; 初始化左指针x为数组…

融资项目——通过OpenFeign在分布式微服务框架中实现微服务的远程调用

1.OpenFeign配置 首先&#xff0c;在需要调用其他的微服务的微服务中引入相关依赖。&#xff08;大多数项目中各微服务需要互相调用&#xff0c;可以直接在每个微服务中引入依赖&#xff09; <!--服务调用--><dependency><groupId>org.springframework.clou…

Transformer算法详解

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法简介 Transformer架构于2017年6月推出。最初的研究重点是自然语言处理领域的翻译任务。随后&#xff0c;几个具有影响力的模型被引入&#…

使用 ANN 进行输电线路故障检测

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 背景 输电线路的重要性&#xff1a;输电线路在电力系统中至关重要&#xff0c;负责将电力从电源传输到配电网络。现代社会对可靠电力的需求呈指…

Windows Docker 部署 MySQL

部署 MySQL 打开 Docker Desktop&#xff0c;切换到 Linux 容器。然后在 PowerShell 执行下面命令&#xff0c;即可启动一个 MySQL 服务。这里安装的是 8.3.0 Tag版本&#xff0c;如果需要安装其他或者最新版本&#xff0c;可以到 Docker Hub 进行查找。 docker run -itd --n…