博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最短路之 SPFA(判环+负权)
阅读量:4286 次
发布时间:2019-05-27

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

下面有两种写法不同的时间复杂度可以根据自己的理解程度去选择

第一种:

void Add(int u,double cost,int v)//邻接表存储关系{    w[top] = cost;    Key[top] = v;    next[top] = head[u];    head[u] = top++;}bool SPFA(int x){    memset(vis,false,sizeof(vis));    memset(inq,0,sizeof(inq));    queue
Q; for(int i = 1;i <= n;i++) dis[i] = (i == x ? 0 : INF); vis[x] = true; inq[x] = 1; Q.push(x); while(!Q.empty()) { int cur = Q.front(); Q.pop(); vis[cur] = false; for(int e = head[cur] ; e != -1; e = next[e]) { int v = Key[e]; if(dis[v] < dis[cur] * w[e]) { dis[v] = dis[cur] * w[e]; if(!vis[v]) { inq[v] ++; if(inq[v] >= n) return true;//如果入队次数超过n-1次说明存在环或负权 Q.push(v); vis[v] = true; } } } } return false;}

第二种

初始化 map 为正无穷
bool SPFA(int x){    queue
Q; memset(vis,false,sizeof(vis)); memset(in,false,sizeof(in)); for(int i = 1;i <= n;i++) dis[i] = (i==x?0: INF); vis[x] = true; Q.push(x); in[x] = 1; while(!Q.empty()) { int cur = Q.front(); Q.pop(); vis[cur] = false; for(int i = 1;i <=n;i++) { if(map[cur][i]!=-INF&&dis[i] < dis[cur] * map[cur][i]) { dis[i] = dis[cur] * map[cur][i]; if(!vis[i]) { in[i] ++; if(in[i] >= n) return true;//如果入队次数超过n-1次说明存在环或负权 Q.push(i); vis[i] = true; } } } } return false;}

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

你可能感兴趣的文章
【JDK】:ArrayList和LinkedList源码解析
查看>>
【JDK】:ConcurrentHashMap高并发机制——【转载】
查看>>
nginx 运行与操作
查看>>
nginx 负载均衡
查看>>
js bootstrap 警告框的隐藏和显示
查看>>
centos 7.1安装docker
查看>>
docker 创建一个新镜像
查看>>
docker server gave HTTP response to HTTPS client 问题处理办法
查看>>
docker 导入与导出镜像
查看>>
docker 创建本地registry并push镜像
查看>>
docker 在push镜像到本地registry出现的500 Internal Server Error
查看>>
Linux磁盘空间查看及空间满的处理
查看>>
Linux下clock计时函数学习
查看>>
OpenMp多线程编程计时问题
查看>>
Linux/Unix 环境下实现精确计算程序运行的时间
查看>>
C++实现统计代码运行时间计时器的简单实例
查看>>
c++ 内联函数(一看就懂)
查看>>
比较fscanf 和getline读取文件效率
查看>>
(文件)输出不使用科学技术法
查看>>
LaTeX 算法代码排版 --latex2e范例总结
查看>>