spfa算法判断是否存在负权回路

news2024/12/28 20:54:00

spfa算法判断是否存在负权回路

  • 题目

当一个图中存在一个负权回路时,是无法利用spfa 算法去求最短路问题的,但是可以利用spfa 算法判断有没有负权回路

题目

给定一个 n n n 个点 m m m 条边的有向图,图中可能存在重边和自环, 边权可能为负数

请你判断图中是否存在负权回路。

输入格式

第一行包含整数 n n n m m m

接下来 m m m 行每行包含三个整数 x , y , z x,y,z x,y,z,表示存在一条从点 x x x 到点 y y y 的有向边,边长为 z z z

输出格式
如果图中存在负权回路,则输出 Yes,否则输出 No

数据范围

1 ≤ n ≤ 2000 1 \le n \le 2000 1n2000,
1 ≤ m ≤ 10000 1 \le m \le 10000 1m10000,
图中涉及边长绝对值均不超过 10000 10000 10000

输入样例:

3 3
1 2 -1
2 3 4
3 1 -4

输出样例:

Yes

相比于正常的 spfa 算法,空间方面,需要多开一个cnt 数组,代表对应下标的点从起始点出发走过的边数。

当这个边数出现了比总节点大于等于的情况,就说明了有负权回路的存在。

因为正常情况下,一条路最多有 n - 1条边,如果走了 n 条边,说明一定有两个点是重合的,也就证明了,一定有回路,而由于只有是负权回路的时候,才能更新边,所以就证明了一定存在负权回路

在这里插入图片描述

与正常的spfa差别是多开了一个cnt 数组
在这里插入图片描述


在这里插入图片描述

相较于 正常的spfa算法,只有这几处不同,外加上没有刚开始的设置正无穷大。

之所以没有设置,是因为不需要设置,有没有负权回路跟 dist 刚开始的值是无关的,因为如果有负权回路的存在时,一定会更新数组 cnt 的值和 数组 dist 的值。


完整代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>

using namespace std;

const int N = 2010, M = 10010;

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

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


bool spfa()
{
    
    queue<int> q;
    for (int i = 1; i <= n; i++)
    {
        q.push(i);
        st[i] = true;
    }
    
    while (q.size())
    {
        int t = q.front();
        q.pop();
        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.push(j);
                    st[j] = true;
                }
            }
        }
    }
    
    return false;
}


int main()
{
    scanf("%d%d", &n, &m);
    memset(h, -1, sizeof h);
    for (int i = 0; i < m; i++)
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        add(a, b, c);
    }
    
    if (spfa()) puts("Yes");
    else puts("No");
    
    return 0;
}




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

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

相关文章

VisionPro二次开发学习笔记11-使用 Caliper和Fixture定位Blob工具检测方块

该示例演示了如何使用卡尺工具和夹具工具来固定 Blob 工具。示例代码将检测图像上部区域中小方块的存在。当点击“运行”按钮时&#xff0c;将读取一张新图像。卡尺工具将被运行&#xff0c;卡尺工具的输出 Y 信息将传递给夹具工具。夹具工具使用来自卡尺工具的 Y 信息和新图像…

新手养猫怎么选智能猫砂盆?不踩雷平价实用攻略测评分享!

众所周知&#xff0c;猫咪是非常爱干净的动物&#xff0c;一旦猫砂盆满了&#xff0c;它们就可能会选择其他角落“解决”&#xff0c;这不仅会让家里充满异味&#xff0c;还可能影响猫咪的健康。而长期堆积的猫砂&#xff0c;也容易滋生细菌&#xff0c;对猫咪的爪子也是一种伤…

[CISCN2019 华东南赛区]Web111

打开题目&#xff0c;看到题目 注意最下面的Build With Smarty! , 猜测是smarty模板注入。smart是php的模板引擎&#xff0c;模板引擎的作用就是分离前端页面和数据的&#xff0c;题目中显示API的URL由于环境的原因无法使用&#xff0c;但我们的IP依旧显示在了页面的右上角&…

python-约瑟夫环(赛氪OJ)

[题目描述] n 个人&#xff08; 0,1,2,3,4...n−1 &#xff09;&#xff0c;围成一圈&#xff0c;从编号为 k 的人开始报数&#xff0c;报数报到 m 的人出队。 下次从出队的人之后开始重新报数&#xff0c;循环往复&#xff0c;当队伍中只剩最后一个人的时候&#xff0c;那个人…

【Material-UI】Checkbox 组件中的 Label Placement 设置详解

文章目录 一、Checkbox 组件简介1. 组件概述2. labelPlacement 属性 二、labelPlacement 属性的使用方法三、各标签位置的效果与应用场景1. Top&#xff08;顶部&#xff09;2. Start&#xff08;左侧&#xff09;3. Bottom&#xff08;底部&#xff09;4. End&#xff08;右侧…

【文献精读】LOCA 图4

&#xff08;1&#xff09;数据流动 QKV的选取

Compass Arena 上新啦!新增双多模态模型匿名对战

2024 年 5 月&#xff0c;上海人工智能实验室司南 OpenCompass 团队 与魔搭 ModelScope 联合推出了大模型评测平台——Compass Arena&#xff08;大模型竞技场&#xff09;&#xff0c;为国内的大语言模型领域引入了一种全新的竞技模式。 今天&#xff0c;Compass Arena 迎来重…

JVM知识总结(G1收集器)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ G1收集器 G1**&#xff08;Garbage First&#xff09;是一款面向服…

Mocaverse「Enter MOCALAND」上线!

我们很高兴宣布 Mocaverse 和 The Sandbox 将开展一项新合作——「Enter MOCALAND&#xff01;」 继 “Into the Unknow” Game Jam 成功举办之后&#xff0c;我们的创作者们在此基础上创作出了近 50 款未来派多人游戏&#xff0c;我们很高兴能继续与社区一起庆祝共同创作&…

Redis与DataBase保持数据一致性

文章目录 1. 读取数据2. 写数据2.1 先操作缓存2.2 先操作数据库 在我们系统中缓存最常用的策略是&#xff1a;服务端需要同时维系DB和Cache&#xff0c;并且是以DB的结果为准&#xff0c; Cache-Aside Pattern&#xff08;缓存分离模式、旁路缓存&#xff09;。 1. 读取数据 当…

高质量翻译对中国移动应用在国外市场推广的影响

在移动应用的竞争格局中&#xff0c;打入国外市场对中国开发商来说既是机遇也是挑战。决定中国移动应用程序在海外成功的最关键因素之一是其翻译质量。高质量的翻译在有效推广该应用程序、确保其与当地用户产生共鸣&#xff0c;并最终推动新市场的采用和增长方面发挥着关键作用…

嵌入式全栈开发学习笔记---数据结构(广度优先算法)

目录 过程分析 代码实现 queue_maze.c 上节我们讲完了队列&#xff0c;本节开始学习广度优先算法&#xff01; 之前我们用深度优先算法找出从迷宫出来的所有路径&#xff0c;本次我们要用广度优先算法找出最短路径。 过程分析 广度优先算法也叫广度优先搜索。 这种算法就相当…

Qwen2-Math 开源 AI 模型发布;阿里云推出首个域名 AI 大模型应用丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思…

vscode用快捷键一键生成vue模板

项目中有些代码模块是固定的&#xff0c;如下面的代码所示&#xff0c;为了不重复写这些相同的代码&#xff0c;我们可以使用快键键一键生成模板。 流程&#xff1a; 中文&#xff1a;首选项-> 用户代码片段 -> 输入框中输入vue,找到vue.json文件&#xff08;没有vue.j…

如意AI健康管理开放域自然对话算法分析报告

一、算法全周期行为分析 1. 算法安全 信息内容安全&#xff1a;通过意图识别和实体抽取技术&#xff0c;确保生成的内容不涉及违法或不当信息。 信息源安全&#xff1a;数据采集环节采用安全措施&#xff0c;保护数据不被非法访问。 2. 算法监测 信息安全监测&#xff1a;实施实…

国产芯上运行TinyMaxi轻量级的神经网络推理库-米尔基于芯驰D9国产商显板

本篇测评由优秀测评者“短笛君”提供。 本文将介绍基于米尔电子MYD-YD9360商显板&#xff08;米尔基于芯驰D9360国产开发板&#xff09;的TinyMaxi轻量级的神经网络推理库方案测试。 算力测试 TinyMaix 是面向单片机的超轻量级的神经网络推理库&#xff0c;即 TinyML 推理库&a…

重头开始嵌入式第十六天(结构体,共用体)

目录 结构体 结构体定义 结构体初始化 结构体赋值 结构体调用 结构体大小 在 C 语言中&#xff0c;结构体内存对齐规则主要遵循以下原则&#xff1a; 共用体 共用体定义 共同体赋值&#xff0c;初始化 共用体大小 结构体与共用体的区别 结构体 在 C 语言中&#xff0c;…

vuex properties of undefined (reading ‘getters‘)

前言&#xff1a; 最近打算用vue 写个音乐播放器&#xff0c;在搞 vuex 的时候遇到一个很神奇报错&#xff1b;vuex 姿势练了千百次了&#xff0c;刚开始的时候我一直以为是代码问题&#xff0c;反复检查了带了&#xff0c;依旧报错。 Error in mounted hook: "TypeError:…

PHP全方位多功能投票小程序系统源码

&#x1f31f;【全民参与&#xff0c;决策更精彩】全方位多功能投票小程序大揭秘&#xff01;&#x1f389; &#x1f680; 开篇引入&#xff1a;投票新风尚&#xff0c;尽在指尖 Hey小伙伴们&#xff0c;你是否厌倦了传统的投票方式&#xff0c;觉得它们既繁琐又不够灵活&am…

历代文学-技术生态-总体介绍

1. 历代文学简介 历代文学&#xff08;https://literature.sinhy.com/#/literature?__c1000&#xff0c;微信小程序可直接搜索“历代文学”&#xff09;是一个由两个人&#xff08;一个后端和一个前端&#xff09;开发的文学网站&#xff0c;是一个收录从古到今、以及古今中外…