spfa负环判断(DFS+BFS两种)

本文深入探讨了SPFA算法在处理含负权值最短路径问题上的应用,特别关注其在差分约束系统中的表现。文章详细介绍了两种策略:BFS和DFS,用于同时计算最短路径并检测负环,提供了具体实现代码,是理解SPFA算法及其在特定场景下应用的重要资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

给定一个图,判断有无负环


虽然spfa很不稳定_(:з」∠)_ ,但在处理含负权值最短路时为首选(特别是差分约束系统)

而部分题目额外要求判断有无负环(即最短路为-\infty)

下面给出由BFS(最短路算法一般基于bfs),与DFS(一般用于处理环)两种不同的同时计算最短路与寻找负环的思路

 

BFS:基于Bellman-Ford算法,通过判断一个点relax()操作,是否进行次数\geq N(即走了至少N个点)

由于BFS处理环能力较弱,故该判断方法若遇到负环很可能TLE

bool spfa(int org){
  memset(dis, 60, sizeof(dis));
  int i;
  queue<int> Q;
  dis[org] = 0, vis[org] = true, Q.push(org);
  while(!Q.empty()){
    int u = Q.front(); Q.pop();
    vis[u] = false;
    for(i = head[u]; i; i = e[i].next){
      int v = e[i].to, w = e[i].w;
      if(dis[v] > dis[u] + w){
        dis[v] = dis[u] + w;
        cnt[v] = cnt[u] + 1;
        if(cnt[v] == N + 1) return false;
        if(!vis[v]) Q.push(v), vis[v] = true;
      }
    }
  }
  return true;
}

 

DFS:dfs通过后向边即可以快速的判断环,如果一个relax()操作通过后向边则有负环(即最短路形成了一个环)

DFS处理最短路能力较若弱,一般针对负环的题目

PS:其实这已经已经不是spfa了,而是相当于针对环的Bellman-Ford

bool spfa(int u){
  vis[u] = true;
  int i;
  for(i = head[u]; i; i = e[i].next){
    int v = e[i].to, w = e[i].w;
    if(dis[v] > dis[u] + w){
      dis[v] = dis[u] + w;
      if(vis[v]) return false;
      if(!spfa(v)) return false;
    }
  }
  vis[u] = false;
  return true;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值