最短路最新心得

如果,上面的图,如果用dij算法,那么dist[4] = 4,  是得不到正确的结果的, 这个因为dist[3]先被确定是最小,然后用来更新dist[4]

但是存在负权,使得dist[3]更小,但是我们已经把结点3标记为不可用了(vis[3] = true), 所以存在错误

如何使得使得结点3可用呢? 我们把判断的条件给改一下,如果结点u出队列之后,其权值为dist[u] 来得小, 那么就可以用它来更新其他的定点

这样子,每个结点都可以多次入队列, 使得dij可以处理负权

 1 int dij(int x, int y, int n)
 2 {
 3     for (int i = 1; i <= n; ++i)
 4         dist[i] = INF;
 5     priority_queue<Edge> q;
 6     Edge cur, tmp;
 7     cur.dist = dist[x] = 0;
 8     cur.v = x;
 9     q.push(cur);
10     while (!q.empty())
11     {
12         cur = q.top(); q.pop();
13         int u = cur.v;
14         if (dist[u] < cur.dist)//如果cur.dist < dist[u], 那么可以继续更新其他顶点, 代替了条件vis[u]
15             continue;
16         for (int i = 0; i < g[u].size(); ++i)
17         {
18             int v = g[u][i].v;
19             if (dist[v] > dist[u] + g[u][i].dist)
20             {
21                 tmp.dist = dist[v] = dist[u]+ g[u][i].dist;
22                 tmp.v = v;
23                 q.push(tmp);
24             }
25         }
26     }
27     return dist[y];
28 }

 

 

bellaman__ford算法的无用操作

void relax(int u, int v,double weight)
{if(dist[v] > dist[u] + weight)dist[v] = dist[u] + weight;
}
bool bellman_ford(int n, int m)
{int i,j;for(i=0; i<n-1; ++i)//n-1循环for(j=0; j<m; ++j)//枚举所有的边去松弛最短路径
        {relax(g[j].u,g[j].v,g[j].weight);}bool flag = false;for(i=0; i<m; ++i)if(dist[g[i].v] > dist[g[i].u] + g[i].weight){flag = true;break;}return flag;
}

如上述代码所示, 我们枚举每条边, 看看能不能松弛最短路径, 但这么做,其实做了很多的无用功, 比如说如果 dist[g[j]] 没有被松弛过或者松弛不成功,

那么relax(g[j].u,g[j].v,g[j].weight) 做的就是无用功

 

对于这个, 我们可以用队列来优化bellman算法, (上交的大神发明的,时间复杂度是O(ke),k是常数,虽然后来被证实它证明的k是常数是错误的)

如果结点u被更新过了, 那么才可以用它来更新它所指向的定点 

 

int spfa(int x, int y, int n)
{for (int i = 1; i <= n; ++i)dist[i] = INF;queue<int> q;q.push(x);dist[x] = 0;while (!q.empty()){int u = q.front(); q.pop();vis[u] = false;for (int i = 0; i < g[u].size(); ++i){int v = g[u][i].v;if (dist[v] > dist[u] + g[u][i].dist){dist[v] = dist[u] + g[u][i].dist;//能更新就更新if (!vis[v])//如果结点在队里里面,就不用重复入队了
                {q.push(v);vis[v] = true;}}}}return dist[y];
}

 

转载于:https://www.cnblogs.com/justPassBy/p/4646413.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459148.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java canvas 缩放图片_java-GWT:放大和缩小画布绘图

我想应用放大和缩小,并在画布上重新绘制对象,以便在最大和最小缩放级别都能获得清晰的视图.我获得了如何执行操作的参考here,因此我已将画布传递给可缩放图像构造函数而不是图像,并按照所有步骤进行操作.我再次在“ mainDraw”方法中重画对象,但没有得到正确的结果.我知道我缺少…

MATLAB中MEX文件的编写与调试

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com http://item.taobao.com/item.htm?spma1z10.5-c.w4002-9510581626.24.ZO6sko&id43401674106 精通MATLAB混合编程视频讲解 MATLAB各类函数…

数据库设计思考

一&#xff1a;没有完美的数据库设计&#xff0c;只有符合业务的数据库设计&#xff01; 二&#xff1a;我们的数据库设计&#xff0c;在遵守标准&#xff08;三大范式&#xff09;的同时也要考虑客户的体验&#xff01; 有用户才有天下&#xff01; 三&#xff1a;数据库设计时…

performSegueWithIdentifier:sender里边的sender是啥意思

performSegueWithIdentifier:sender里边的sender是啥意思啊&#xff1f;怎样用啊&#xff1f; [self performSegueWithIdentifier:"pushSign" sender:self]; [self performSegueWithIdentifier:"pushSign" sender:sender]; [self performSegueWithIdent…

java wrapper怎么运行_如何从智能合约中生成Java Wrapper

在本文中&#xff0c;我们将了解如何直接从智能合约生成Java Wrapper类以与Java中的智能合约进行交互。从智能合约生成Java Wrapper类有不同的方法&#xff1a;1. Web3j命令行工具和solc2. Web3j命令行工具和Truffle构建生成的工件3. web3j-maven-plugin4. web3j-gradle-plugin…

Hive 1.2.1SparkSqoop安装指南

目录 目录 1 1. 前言 1 2. 约定 2 3. 服务端口 2 4. 安装MySQL 2 4.1. 安装MySQL 2 4.2. 创建Hive元数据库 4 5. 安装步骤 5 5.1. 下载Hive 1.2.1二进制安装包 5 5.2. 安装Hive 5 5.3. 安装MySQL-Connector 5 5.4. 修改配置 5 5.4.1. 修改/etc/profile或~/.profile 5 5.4.2. 修…

Matlab与C/C++混合编程调用OpenCV

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com http://item.taobao.com/item.htm?spma1z10.5-c.w4002-9510581626.24.ZO6sko&id43401674106 精通MATLAB混合编程视频讲解 MATLAB各类函数…

STL--排序与检索

题目 现有N个大理石&#xff0c;每个大理石上写了一个非负整数。首先把各数从小到大排序&#xff0c;然后回答Q个问题。每个问题是否有一个大理石写着某个整数x,如果是&#xff0c;还要回答哪个大理石写着x。排序后的大理石从左到右编写为1-N。&#xff08;样例中&#xff0c;…

体验LESS CSS 框架

LESS基于NODE.JS的一种框架性语言&#xff0c;它可以更好更快捷的来搭建网站框架结构&#xff1b; 而后LESS 将 CSS 赋予了动态语言的特性&#xff0c;如 变量&#xff0c; 继承&#xff0c;运算&#xff0c; 函数. LESS 既可以在 客户端 上运行 (支持IE 6, Webkit, Firefox)&a…

java添加按钮点击事件_如何为odoo 10中的按钮点击事件添加一个java脚本处理程序?...

我想使用java脚本为header中的按钮创建一个处理程序。下面我视图模型给出&#xff1a;如何为odoo 10中的按钮点击事件添加一个java脚本处理程序&#xff1f;inherit_id"web.assets_backend">rel"stylesheet">my_pet_store_formpetstore.messageformc…

LeetCode(53):Maximum Subarray

Maximum Subarray: Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1] has the largest sum 6. 题意&#xff1a;找…

孩子教育

看了一圈学区房&#xff0c;基本上把浦东各个一流二流学校全看一遍了&#xff0c;大体下来觉得未必非要到一流学校附近买学区房&#xff0c;主要是家庭经济条件不允许&#xff0c;再者我和老公希望孩子在小学培养读书的习惯&#xff0c;而不是天天做试卷。所以一流学校和二流学…

python 程序打包 vscode_使用VScode编写python程序并打包成.exe文件

听说Visual Studio Code(VS Code)的诸多好处&#xff0c;了解了一下果真很喜欢&#xff0c;我喜欢它的缘由主要有3个&#xff0c;一是VS Code开源且跨平台&#xff0c;二是由于其界面很是酷&#xff0c;三是能够知足个人大所属代码需求&#xff0c;除此以外固然还有强大的好奇心…

使用命名空间、头文件和实现文件

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 2.3 使用命名空间、头文件和实现文件 使新的throttle类满足程序的需求将是非常…

Permissions for id_rsa are too open

为什么80%的码农都做不了架构师&#xff1f;>>> Last week I was lucky enough to have my laptop upgraded (yay SSD) which meant I needed to configure a new install of OSX Lion. Most of my files are stored online (email, documents, code, etc) but I m…

java看图_看图吧,Java

package salary;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.text.NumberFormat;public class Salary extends JFrame{//声明标签private JLabel numl;private JLabel basel;private JLabel salel;//声明文本框private JTextField numf;priva…

解决端口占用

tomcat启动时报错&#xff1a; 这说明8080端口已被其他程序占用&#xff0c;先用命令提示符 "netstat -ano" 显示端口&#xff0c;再在结果中找到端口&#xff0c;然后根据其PID再输入"tasklist"命令&#xff0c;在结果中查找其对应程序&#xff0c;就可知…

Python笔记-第一天

1。Python的输出print函数要把输出的字符串用单引号或者双引号括起来&#xff0c;但是不能混用。比如print(hello,world)和print("hello,world")是相同的。2.大小写敏感。3.由于缩进使用空格&#xff0c;复制代码不再那么方便。4.我在notepad中设置了Tab自动转化为4个…

Saltstack 报错 python-crypto randomPool_DeprecationWarning:

执行saltstack 报错一下信息根据报错信息修改python文件#若遇报错1#Starting salt-master daemon: /usr/lib64/python2.6/site-packages/Crypto/Util/number.py:57: PowmInsecureWarning: Not using mpz_powm_sec. You should rebuild using libgmp > 5 to avoid timing at…

java接口源码_java collection接口源码

package java.util;/** 1.Collection接口是集合继承关系中的根接口(root interface),有些集合允许重复元素&#xff0c;* 有些集合有序&#xff0c;JDK不提供本接口的实现&#xff0c;只提供子接口的实现(例如Set,List)* 2.所有实现Collection(或者其子接口)的类都必须包含两个…