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);}}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++初阶 类(上)

目录 1. 什么是类 2. 如何定义出一个类 3. 类的访问限定符 4. 类的作用域 5. 类的实例化 6. 类的大小 7. this指针 1.this指针的引出 2. this指针的特性 8. 面试题 1. 什么是类 在C语言中&#xff0c;不同类型的数据集合体是结构体。为了方便管理结构体&#xff0c;我…

使用Python快速提取PPT中的文本内容

直接提取PPT中的文本内容可以方便我们进行进一步处理或分析&#xff0c;也可以直接用于其他文档的编撰。通过使用Python程序&#xff0c;我们可以快速批量提取PPT中的文本内容&#xff0c;从而实现高效的信息收集或对其中的数据进行分析。本文将介绍如何使用Python程序提取Powe…

智能泵站智能运维系统

在现代化城市建设和工农业发展中&#xff0c;泵站作为关键的水利设施&#xff0c;其运行效率和稳定性至关重要。然而&#xff0c;传统的泵站运维方式往往依赖于人工巡检和定期维护&#xff0c;这种方式不仅效率低下&#xff0c;而且难以应对突发状况。随着物联网技术的飞速发展…

在表格中循环插入表单

<template><div class"key">{{ruleForm.casesRange}}<el-form label-position"top" :model"ruleForm" refruleForm><el-form-item label"这个表格怎么写"><el-table :data"tableData" border>…

深圳恒峰智慧|便携式森林灭火泵:森林安全的守护者

在自然环境中&#xff0c;森林是生态系统的重要组成部分&#xff0c;它们为我们提供氧气、净化空气、保持水源和防止土壤侵蚀等重要功能。然而&#xff0c;一旦森林发生火灾&#xff0c;这些宝贵的生态资源将面临巨大的破坏。为了保护森林资源&#xff0c;我们需要一种高效、便…

2024腾讯云服务器优惠价格99元一年,多配置报价表

腾讯云服务器99元一年是真的吗&#xff1f;真的&#xff0c;99元优惠购买入口 txybk.com/go/99 折合每天8元1个月&#xff0c;腾讯云99元服务器配置为2核2G3M带宽&#xff0c;2024年99元服务器配置最新报价为61元一年&#xff0c;如下图&#xff1a; 腾讯云服务器99元一年 腾讯…

Wireshark——获取捕获流量的前N个数据包

1、问题 使用Wireshark捕获了大量的消息&#xff0c;但是只想要前面一部分。 2、方法 使用Wireshark捕获了近18w条消息&#xff0c;但只需要前5w条。 选择文件&#xff0c;导出特定分组。 输入需要保存的消息范围。如&#xff1a;1-50000。 保存即可。

【SSCI稀缺版面】最快录用仅2个月(内附录用发表时间节点)

录用案例 JCR4区经济管理类SSCI (进展顺) 【期刊简介】IF&#xff1a;0-1.0&#xff0c;JCR4区&#xff0c;中科院4区&#xff1b; 【检索情况】SSCI在检&#xff1b; 【征稿领域】计算机/数据建模在经济与管理决策绩效评价的形态应用相关研究均可&#xff1b; 【案例分享】…

COMSOL中使用自定义函数

目录 函数的用法 &#xff08;1&#xff09;解析函数 &#xff08;2&#xff09;插值函数 &#xff08;3&#xff09;分段函数 &#xff08;4&#xff09;高斯脉冲 &#xff08;5&#xff09;斜坡函数 &#xff08;6&#xff09;阶跃函数 &#xff08;7&#xff09;矩形…

C# WinForm AndtUI第三方库 Table控件使用记录

环境搭建 1.在NuGet中搜索AndtUI并下载至C# .NetFramework WinForm项目。 2.添加Table控件至窗体。 使用方法集合 1.单元格点击事件 获取被点击记录特定列内容 private void dgv_CellClick(object sender, MouseEventArgs args, object record, int rowIndex, int columnIn…

传统应急照明解决方案和新标准下地铁应急照明的方案区别

传统地铁站应急照明系统方案 传统地铁站应急照明系统一般设置2套或4套,给相应端区域的应急照明提供电源。由于地铁站应急照明系统设计比较成熟&#xff0c;几乎所有的地铁站接线方案均采用了经典的双电源切换加蓄电池逆变交流220/380V的配电方式.以南方某地铁站为例,此地铁站是…

DDS技术概述及测试策略与方案

随着车载通信技术的快速发展&#xff0c;传统的通信技术在满足车载通信需求方面面临着一些挑战。车载通信对实时性、可靠性以及通信带宽的需求越来越高&#xff0c;同时车载通信环境存在多路径衰落、信号干扰等问题&#xff0c;这些都给通信技术的选择和应用带来了一定的挑战。…