博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spfa
阅读量:2125 次
发布时间:2019-04-30

本文共 1559 字,大约阅读时间需要 5 分钟。

  • 判断是否存在负环
  • 求带有负边权的最短路
    当某个点入队大于N次,一定存在负环。
  • 其他
    一直纠结能否把判断一个点被更新N次作为判断依据
    临接表不行因为数据可能两个点之间有大于N条边,而且每条边是降序排列
    临接矩阵不知道行不行

模板

using namespace std;int inf = 0x3f3f3f3f;struct ac{
int v, c;};int dis[N], cnt[N];bool vis[N];vector
g[N];bool spfa(int start , int n) {
mem(cnt, 0); mem(dis, inf); mem(vis, false); dis[start] = 0; queue
que; // 将源点入队 que.push(start); vis[start] = true; cnt[start] = 1; while (!que.empty()) {
int u = que.front(); que.pop(); vis[u] = false; for (int i = 0; i < g[u].size(); ++i) {
int v = g[u][i].v; int c = g[u][i].c; if (dis[v] > dis[u] + c) {
dis[v] = dis[u] + c; // 更新的点是否已经入队 if (vis[v] == false) {
vis[v] = true; que.push(v); // 入队大于 n 次,存在负环 if (++cnt[v] > n) return true; } } } } return false;}

dfs判断负环

struct ac{
int v, w;};int dis[maxn], vis[maxn], flag;vector
g[maxn];void Spfa(int x) {
vis[x] = 1; for (int i = 0, v,w; i < (int)g[x].size(); ++i) {
v = g[x][i].v; w = g[x][i].w; if (dis[v] <= dis[x] + w) continue; if (vis[v]) {
flag = 1; return; } dis[v] = dis[x] + w; Spfa(v); if (flag) return; } vis[x] = 0;}int main() {
flag = 0; mem(dis, inf); mem(vis, 0); dis[1] = 0; Spfa(1); return 0;}

转载地址:http://nkprf.baihongyu.com/

你可能感兴趣的文章
云原生 第十三章 Kubernetes网络概念及策略控制
查看>>
《redis设计与实现》 第一部分:数据结构与对象 || 读书笔记
查看>>
《redis设计与实现》 第二部分(第9-11章):单机数据库的实现
查看>>
算法工程师 面经2019年5月
查看>>
搜索架构师 一面面经2019年6月
查看>>
稻草人手记
查看>>
第一次kaggle比赛 回顾篇
查看>>
leetcode 50. Pow(x, n)
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
查看>>
Loadrunner之https协议录制回放报错如何解决?(九)
查看>>
python中xrange和range的异同
查看>>
列表、元组、集合、字典
查看>>