首页 > 其他分享 >图论-SPFA与差分约束

图论-SPFA与差分约束

时间:2024-06-06 12:44:29浏览次数:9  
标签:pre 图论 int inq 差分 SPFA dis

闻道有先后,术业有专攻

当用来判断负环的时候,SPFA 还挺好用的


int pre[N];
void print_path(int s, int t){
    if(s == t) {cout << s; return ;}
    print_path(s, pre[t]);
    cout <<" " << t;
}

int head[N], cnt;
struct Edge{
    int from, to, nxt, c;
}e[N << 1];
void add(int u, int v, int c){
    e[++cnt].from = u;
    e[cnt].to = v;
    e[cnt].nxt = head[u];
    head[u] = cnt;
    e[cnt].c = c;
}
int dis[N], Neg[N];
bool inq[N];
int spfa(int s){
    memset(Neg, 0, sizeof(Neg));
    Neg[s] = 1;
    for(int i = 1; i <= n; i++) dis[i] = 1e9, inq[i] = false;
    dis[s] = 0;
    queue<int> Q;
    Q.push(s);
    inq[s] = true;
    while(!Q.empty()){
        int u = Q.front(); Q.pop();
        inq[u] = false;
        for(int i = head[u]; i != 0; i = e[i].nxt){
            int v = e[i].to, c = e[i].c;
            if(dis[v] > dis[u] + c){
                dis[v] = dis[u] + c;
                pre[v] = u;
                if(!inq[v]){
                    inq[v] = true;
                    Q.push(v);
                    Neg[v]++;
                    if(Neg[v] > n){
                        return 1;
                    }
                }

            }
        }
    }
    return 0;
}

如果是差分约束系统的话,那么就先建超级源点 \(S_0\), 连接所有的点,且边权为 0

void solve() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++) add(0, i, 0);
    for(int i = 1; i <= m; i++){
        int u, v, val;
        cin >> v >> u >> val;
        add(u, v, val);
    }
    if(spfa(0)) cout << "NO";
    else{
        for(int i = 1; i <= n; i++){
            cout << dis[i] << " ";
        }
    }
}

标签:pre,图论,int,inq,差分,SPFA,dis
From: https://www.cnblogs.com/9102qyy/p/18220986

相关文章

  • 图论
    1图论1.1图的建立1.1.1领接表边权建图importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassMain{//定义图的邻接表表示staticList<int[]>[]g;//节点数staticintn;//保存某种状态或结果的数组......
  • 最短路图论
    dijkstraCode:#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,int>pii;constintN=1e5+5,inf=INT_MAX;intn,m,dis[N],s;//structnode{//intfrom,to,w,val;//};boolvis[N];vector<pii>edge......
  • ch58x/ch59xADC差分采样NTC电阻获取当前温度
    前言:之前的文章中也有关于使用I2C器件进行温度的采集的文章采集温度的方式不止使用传感器,也可以使用NTC温敏电阻进行采集,此方法的外围电路较为简单切成本较低,代码也较为容易实现。实现原理:先通过差分采样电路进行采集,采集之后可以获取NTC或者定值电阻的电压;已知这些信息可以通过......
  • 区间更新+差分
    题目链接:区间更新代码#include<iostream>usingnamespacestd;constintN=1e5+5;inta[N],b[N];intmain(){ intn,m; while(cin>>n>>m){ for(inti=1;i<=n;i++){ cin>>a[i]; b[i]=a[i]-a[i-1];// cou......
  • 知识点整理 - 连通性相关 | 《综述图论中连通性及相关问题的一些处理方法》学习笔记
    是ix35老师论文的学习笔记,同时也用作连通性相关知识梳理。可能不会包含很多定义,只会挑重要的写。会包含一些例题。定义与记号\(u\rightsquigarrowv\)代表\(u\)到\(v\)的一条路径。有时也会用这个记号表示连通性。无向图点/边连通度:若\(u,v\)任意点割集大小不小......
  • 图论-最近公共祖先
    例题:祖孙询问 给定一棵包含 n......
  • FDTD Solutions(时域有限差分)仿真技术与应用
    FDTDSolutions求解物理问题的方法FDTD与麦克斯韦方程FDTD中的网格化FDTDSolutions功能与使用主窗口——CAD人机交互界面计算机辅助设计(CAD)模拟编辑器:主标题栏、工具条实体对象树实体对象库脚本提示与脚本编辑窗口软件操作几何结构简单几何结构的添加通过脚......
  • 数组算法-差分数组
    //差分数组使用背景:区间元素同步增减//差分数组:用来表示原始数组中相邻元素的差值,表示原数组的变化。classex_diff{private:vector<int>diff;public:ex_diff(vector<int>nums){/**求diff[]*diff[i]=nums[i],i......
  • cadence allegro差分线单边走线
    像这种差分对交叉或者空间不够,我们可以先走一根,再去走另一根的时候做等长。在走线时点击鼠标右键,勾选·singletracemode,先连接较远的一根。再看右下角,注意等长,绿色即可,连第二根。这一步可以直接选蛇形走线蛇形走线如图操作,先点击工具栏图标,在选择走线类型。......
  • 动态规划--图论中使实用场景概述
    目录一 动态规划概述二 动态规划在图论中应用场景三c实例1.**最短路径问题(Dijkstra算法)**:2.**最小生成树问题(Kruskal算法)**:一 动态规划概述动态规划(DynamicProgramming,简称DP)是一种用于解决具有重叠子问题和最优子结构特性的问题的优化方法。动态规划通过将原......