蒜头君的银行卡(差分)

SPFA算法详解:高效的单源最短路径算法 介绍spfa算法求解最短路和判断负环的思路 阅读详情

蒜头君的银行卡

#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<cmath>
//#include<set>
//#include<vector>
#include<queue>
//#include<map>
//#include<string.h>
using namespace std;

int n,m;
const int maxn=10001;
struct edge{
    int v,nxt,w;
}e[maxn<<1];
int p[maxn],eid=0;
int dist[maxn],cnt[maxn];
bool inq[maxn];
bool spfa(){//有付环,返回true
    memset(inq,0,sizeof(inq));
    memset(dist,0xbfbfbfbf,sizeof(dist));
    memset(cnt,0,sizeof(cnt));
    queue<int>q;
    dist[0]=0;
    q.push(0);
    inq[0]=1;
    cnt[0]++;
    if(cnt[0] > n+1) {//有付环
        return true;
    }
    while(!q.empty()){
        int u=q.front();
        q.pop();
        inq[u]=false;

        for(int i=p[u];i;i=e[i].nxt){
            int v=e[i].v;
            if(dist[u]+e[i].w>dist[v]){ //找最长路
                dist[e[i].v]=dist[u]+e[i].w;
                if(!inq[v]){
                    q.push(v);
                    inq[v]=true;
                    cnt[v]++;
                }
                
                if(cnt[v] > n + 1) {
                    return true;//有付环
                }
            }
        }
    }
    return false;
}
inline void ins(int u,int v,int w){
    e[++eid].v=v;e[eid].nxt=p[u];p[u]=eid;
    e[eid].w=w;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int t;
        scanf("%d",&t);
        int a,b,c;
        if(t==1){
            scanf("%d%d%d",&a,&b,&c);//a - b >= c
            //a - b >= c  ->   b +c <= a 转化为 b-->a 最长路
            ins(b,a,c);
        }
        else if(t==2){
            scanf("%d%d%d",&a,&b,&c);
            //a-b<=c   -> a+(-c)<=b 转化为 a-->b 最长路
            ins(a,b,-c);            
        }
        else{
            scanf("%d%d",&a,&b);
            //a<=b&&b<=a
            ins(a,b,0);
            ins(b,a,0);
        }
    }
    for(int i=1;i<=n;i++)
        ins(0,i,0);     //插入超级源点
   
    if( spfa()) printf("No");//有付环,则无解
    else printf("Yes");
    return 0;
}

 

为啥说SPFA已死?三种图论算法太难懂?深入浅出谈图论,看这篇文章就够了 为了给参赛者出难题,他们会设计一些“恶意”图结构——例如具有大量负权边或复杂的环形结构,这些图会让 SPFA 的队列膨胀得离谱,从而使算法的最坏时间复杂度从 (O(V + E)) 升至 (O(VE))。Floyd-Warshall 算法和前面两位不同,它是个全局性算法,能够在 (O(V^3)) 的时间复杂度内解决任意两点之间的最短路径问题。这使得它在稠密图(边数远大于节点数)的情况下表现较好,尤其是在没有负权边的场景下,Dijkstra 是稳定且高效的选择。但在算法竞赛中,它的命运往往由出题人掌控。 阅读详情

相关推荐

差分约束(Difference constraint)

差分约束 1.差分约束系统(system of difference constraints) 如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统(system of difference constraints)。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。 求解差分约束系统,可以转化成图论的单源最短路...

Konnyaku 1868

SPFA算法(最短路径算法)

SPFA-图论-最小路径

m0_64045085的博客 2万+

spfa算法_C++详解

SPFA算法的全称是:Shortest Path Faster Algorithm,该算法是西南交通大学段凡丁于1994年发表的,它可以在O(kE)的时间复杂度内求出源点到其他所有点的最短路径,其中k为所有顶点进队的平均次数,可以证明k一般小于等于2,可以处理负边,但无法处理带负环的图(负环和负边不是一个概念)。

m0_54615144的博客 1351

搜索与图论 - spfa 算法

spfa 算法

每天进步一点点! 6259

冒险岛脚本函数大全:cm.sendYesNo和cm.warp的20个实战用法

本文深入解析了冒险岛脚本中cm.sendYesNo和cm.warp两个核心函数的20个实战应用场景。从基础的确认对话框交互、条件判断,到复杂的装备强化系统、动态传送与副本入口逻辑,文章通过大量代码示例展示了如何组合运用这两个函数,实现从简单NPC到复杂任务系统的进阶脚本开发,并分享了状态管理、错误处理与性能优化等最佳实践。

t4y5u6i7o的博客 1061

保姆级教程:用CANoe手把手复现ECU刷写全流程(含BootLoader三阶段详解)

本文提供了一份详细的CANoe ECU刷写实战指南,涵盖BootLoader三阶段的深度解析。从实验环境搭建到预编程、主编程及后编程阶段,逐步讲解ECU刷写的关键步骤和隐藏逻辑,特别强调UDS诊断和CAN通信的精确控制,帮助开发者掌握ECU刷写的核心技术。

weixin_29234423的博客 531

计蒜客 – 蒜头君的银行卡 | SPFA – 差分约束系统

计蒜客 – 蒜头君的银行卡 | 算尽天下系列第 10 期 | SPFA – 差分约束系统 上一期,长老向大家分享了一个跟 BFS 很像的、可以求解负环的单源最短路算法 SPFA,今天,让我们来看一下 SPFA 在求解差分约束系统时的力量吧。 如果一个不等式组由 nnn 个变量和 mmm 个约束条件组成,且每个约束条件都是形如 xi−xj≤k,1≤i,j≤nx_i-x_j\leq k,1\leq i...

凝神长老和他的朋友们 243

利用VS2019编写安卓APP的步骤和所遇问题的解决办法

遇到了代码错误,这个可以将鼠标箭头置于错误代码处,这样VS2019给你解决办法,给的方法不能解决,并且读了程序都没有问题,那么你应该重启软件,这样还是不能解决,你尝试重新生成解决方案,还是不能解决有可能是运用的代码与当前版本不相符和、过时了,这个时候应当运用相应版本的代码。注:VS2019编写APP的空间不是很稳定,当你写的代码没有问题,但是出现了报错,可能是空间崩溃了,这个时候可以重启软件。点击“+”号,创建密钥存储,输入“别名”、“密码”、以及下面中的任意一项,直至红色框消失后。

youbestcando的博客 7813

spfa算法_计蒜客 – 蒜头君的银行卡 | 算尽天下系列第 10 期 | SPFA – 差分约束系统...

计蒜客 – 蒜头君的银行卡 | 算尽天下系列第 10 期 | SPFA – 差分约束系统上一期,长老向大家分享了一个跟 BFS 很像的、可以求解负环的单源最短路算法 SPFA,今天,让我们来看一下 SPFA 在求解差分约束系统时的力量吧。如果一个不等式组由 个变量和 个约束条件组成,且每个约束条件都是形如 的不等式,则称其为差分约束系统 (system of difference const...

weixin_39594191的博客 133

[终于解决]Ubuntu14.04 32位安装移动网卡(0bda:b711)驱动8188gu tplink-WN726n

大致梳理一下问题解决的流程 首先,在台式机做了双系统,台式机只有一个网线接口,由于项目要求,需要占用网口传输数据,所以用之前买的tplink-WN726n免驱版2.0的移动网卡 【note】免驱版只能在Windows下安装使用,在Ubuntu系统中无法使用,所以,需要另辟蹊径。 找了很多资料,尝试很多方法,有的复杂有的简单,终于解决。 【思路】首先在Ubuntu系统中输入lsusb,查看是否检测到USB网卡设备。然后从Github中复制代码,构建,安装,然后modprobe一下,到前面那步还不行,就再来一步

瑞o 1万+

Qt/C++音视频开发1-vlc解码播放

一、前言 最开始接触视频监控这块的时候,用的就是vlc作为解码的内核,主要是因为vlc使用简单方便,直接传入一个句柄即可,简单几行代码就可以实现一个视频流播放,很适合初学者使用,也推荐初学者用qt+vlc来做播放器,提供的接口还是非常友好的,而且门类特别多,想要获取媒体文件的各种信息比如宽高,设置宽高比等,直接调用接口函数传入参数就能设置。 所有用vlc做视频监控解码的人都会遇到一个问题,那就是鼠标事件被接管拦截了,不能识别鼠标事件,比如双击最大化等,这就很憋屈了,明明很好用的一个东西,怎么突然之间鼠标事件

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 4940

【差分约束系统】蒜头君的银行卡

大致思路:给你几个不等式,问你有没有解.....典型的差分方程判断有无解(负环)的题型。那我先想好,求最长路吧,那就得把所有不等式化为&gt;=的形式,先由题意列不等式再转化:a比b至少多c元: a-b&gt;=c    ------------&gt;  a-b&gt;=c  -------&gt;add(b,a,c)a比b至多多cc元:a-b&lt;=cc   ---------&gt; b-...

It's the Climb 261

akamai3简单分析

akamai流程的简单分析

记录一些web逆向的过程 917

JSK习题:蒜头君的银行卡-约束差分

思路: 约束差分,若a-b&lt;=c ,则建立b-&gt;a的边,权值为c。根据题意建图,插入超级源点,到达所有顶点且权值为0。 注意: a=b,就相当于a&lt;=b &amp;&amp; a&gt;=b 即建立a-&gt;b 权值为0的边和b-&gt;a 权值为0的边。 代码: #include &lt;iostream&gt; #include &lt;string.h&gt...

Ogmx的博客 673

基于FPGA的以太网设计(1)----大白话解释什么是以太网

基于FPGA的千兆以太网设计(1)----大白话解释什么是以太网

孤独的单刀 3872

大数据领域存算分离:教育行业的数据应用探索

在当今数字化时代,教育行业积累了海量的数据,如学生的学习记录、考试成绩、在线学习行为等。如何高效地存储、管理和分析这些数据,以挖掘其潜在价值,为教育决策、教学改进和学生个性化发展提供支持,成为教育行业面临的重要挑战。大数据领域的存算分离技术为解决这一问题提供了新的思路和方法。本文旨在探索存算分离技术在教育行业的数据应用,分析其原理、优势和实际应用场景,为教育行业的数据管理和分析提供参考。本文共分为十个部分。第一部分介绍背景,包括目的和范围、预期读者、文档结构概述和术语表;

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 813

题解-蒜头君的银行卡

蒜头君的银行卡 描述 虽然蒜头君并没有多少钱,但是蒜头君办了很多张银行卡,共有 n 张,以至于他自己都忘记了每张银行卡里有多少钱了。他只记得一些含糊的信息,这些信息主要以下列三种形式描述: 银行卡 a 比银行卡 b 至少多 c 元。 银行卡 a 比银行卡 b 至多多 c 元。 银行卡 a 和银行卡 c 里的存款一样多。 但是由于蒜头君的记忆有些差,他想知道是否存在一种情况,使得银行卡的存款情况和他...

Ampty36的博客 432

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

计蒜客 蒜头君的银行卡(spfa最短路径及差分约束系统)

#include<bits/stdc++.h> using namespace std; const int MAX_N=10010; const int MAX_M=2*MAX_N; int ss=0; int n,m; struct edge{ int v,next,w; }e[MAX_M]; int p[MAX_N],eid; int dst[MAX_N]; int cn...

amf12345的博客 280

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

蒜头君的银行卡

1000ms 131072K 虽然蒜头君并没有多少钱,但是蒜头君办了很多张银行卡,共有 nn 张,以至于他自己都忘记了每张银行卡里有多少钱了。 他只记得一些含糊的信息,这些信息主要以下列三种形式描述: 银行卡 aa 比银行卡 bb 至少多 cc 元。 银行卡 aa 比银行卡 bb 至多多 cc 元。 银行卡 aa 和银行卡 cc 里的存款一样多。 但是由于蒜头君的记忆有些差,他想知道...

qq_37358510的博客 643

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

差分约束系统

差分约束系统概念 问题转化 解决的问题 例题1: 虽然蒜头君并没有多少钱,但是蒜头君办了很多张银行卡,共有 nn 张,以至于他自己都忘记了每张银行卡里有多少钱了。 他只记得一些含糊的信息,这些信息主要以下列三种形式描述: 银行卡 aa 比银行卡 bb 至少多 cc 元。 银行卡 aa 比银行卡 bb 至多多 cc 元。 银行卡 aa 和银行卡...

amf12345的博客 289

计蒜客葱头君的银行卡&&洛谷P1993 小K的农场

题目描述小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述:农场a比农场b至少多种植了c个单位的作物,农场a比农场b至多多种植了c个单位的作物,农场a与农场b种植的作物数一样多。但是,由于小K的记忆有些偏差,所以他想要知道存不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合。输入输出格式输...

李小原的博客 354

SPFA 算法:实现原理及其应用

SPFA算法,全称为Shortest Path Faster Algorithm,是求解单源最短路径问题的一种常用算法,它可以处理有向图或者无向图,边权可以是正数、负数,但是不能有负环。

MissingPastDay的博客 3252

SPFA算法详解

前置知识:Bellman-Ford算法 前排提示:SPFA算法非常容易被卡出翔。所以如果不是图中有负权边,尽量使用Dijkstra!(Dijkstra算法不能能处理负权边,但SPFA能) 前排提示*2:一定要先学Bellman-Ford! 0.引子 在Bellman-Ford算法中,每条边都要松弛\(n-1\)轮,还不一定能松弛成功,这实在是太浪费了。能不能想办法改进呢? 非常幸运,SPFA算法...

qq_14886903的博客 6299

SPFA详解

引子定义SPFA是Shortest Path Faster Algorithm,是Bellman-Ford算法的改进版。和其他最短路算法一样,都是以松弛操作的三角形不等式为基础操作的。优点SPFA算法用途广,适应负权,还能判断正环和负环……在差分约束建模中也有重大用处……SPFA是个好东西SPFA的实现spfa有两种实现方式,一种是栈实现,一种是队列实现。 在有负环的情况下,栈比队列更快,但是如果

蒟蒻柴犬首相的博客 4463

搜索与图论 --- 最短路 - SPFA 算法、Floyd 算法

第一步,只要队列不空,队列里面还有节点变小的话,先从队列里面取出队头,然后把队头删掉,第二步遍历t的所有出边,如果t变小的话,所有以t为起点的边的终点都有可能变小,更新t的所有出边,例如t→b,距离是w,第三步,如果更新成功的话,把待更新的点b加入队列,加入之前需要判断一下,如果队列之前已经有b的话,b就不用再重复加入了。基本思路就是更新过谁,再拿谁来更新别人,一个点如果没有被更新过的话,那么它再去更新别人一定是没有效果的,只有我变小了,我后面的人才会变小。...

weixin_60569662的博客 2219

SPFA 算法总结

回顾一下使用邻接表的 SPFA 的算法 如上图所示: 假设原点是 1 ,也就是说 1 在队列中 将与 1 节点连接的节点放入队列中 此时更新 d[2]=3 , d[3]=9 , d[4]=7 , d[5]=3 将以上节点放入队列中 此时队列里有 2,3,4,5 节点 然后 2 出队,发现与 2 连接的有 3 号节点,更新 d[3]=5, 但是 3 节点在队列中,所以不再进行操作 之后 3 号节点出队,与 3 号节点连接的只有 4 号节点,但此时 d[4]=7<9+4,选择不跟新..

C_Dreamy的博客 5433
上一篇: 成仙之路(spfa)
下一篇: 蒜厂年会(floyd)
ccshijtgc
博客等级 码龄20年 13粉丝 181原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值