最短路最新心得

如果,上面的图,如果用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 wrapper怎么运行_如何从智能合约中生成Java Wrapper

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

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各类函数…

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…

【MPI学习3】MPI并行程序设计模式:不同通信模式MPI并行程序的设计

学习了MPI四种通信模式 及其函数用法&#xff1a; &#xff08;1&#xff09;标准通信模式&#xff1a;MPI_SEND &#xff08;2&#xff09;缓存通信模式&#xff1a;MPI_BSEND &#xff08;3&#xff09;同步通信模式&#xff1a;MPI_SSEND &#xff08;4&#xff09;就绪通信…

shiro使用jdbc_realm登录验证

2019独角兽企业重金招聘Python工程师标准>>> pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven…

Javascript 严格模式详解

一、概述 除了正常运行模式&#xff0c;ECMAscript 5添加了第二种运行模式&#xff1a;"严格模式"&#xff08;strict mode&#xff09;。顾名思义&#xff0c;这种模式使得Javascript在更严格的条件下运行。 设立"严格模式"的目的&#xff0c;主要有以下几…

使用tableView崩溃

2019独角兽企业重金招聘Python工程师标准>>> 1错误2 正确 转载于:https://my.oschina.net/u/2601834/blog/618892

Java实现连连看源代码文档_Java实现游戏连连看(有源代码)

Java实现游戏连连看(有源代码) JAVA语言实现连连看游戏 1.课程设计目的 Java语言是当今流行的网络编程语言&#xff0c;它具有面向对象、跨平台、分布应用等特点。面向对象的开发方法是当今世界最流行的开发方法&#xff0c;它不仅具有更贴近自然的语义&#xff0c;而且有利于软…

C语言中auto,register,extern,static【转】

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 语言中提供了存储说明符auto&#xff0c;register&#xff0c;extern&#xff0c;stat…

SEO的十种赚钱方式

我深深的想要通过的自己的SEO技术赚钱。其实&#xff0c;掌握一门技术是次要方面&#xff0c;学会把技术变现才是重中之重&#xff0c;所以你说学习SEO重要吗?挺重要&#xff0c;但绝不是最重要的。学SEO的赚钱方式才是最重要的。那么SEO都有哪些赚钱方式呢?我罗列了十种赚钱…

Compile a native C Android application

2019独角兽企业重金招聘Python工程师标准>>> http://www.cnblogs.com/GoAhead/p/4186707.html 通过上网搜索&#xff0c;你可以发现很多种编译Android native应用的方法&#xff0e;我想说的是&#xff0c;不同的控制台应用, 守护程序(daemon), C/C库&#xff0c;等…

J2SE核心实战开发—— 集合类框架

文档都是基于 实验楼 线上环境制作的&#xff0c;因此文档叙述和截图均与其有关。使用其他实验环境也没有太大影响&#xff0c;知识点的操作是类似的。该系列的课程是在 实验楼 实习所原创的第一个课程&#xff0c;欢迎大家多提意见。 一、实验简介 在Java基础语法中&#xff0…

猫和老鼠java下载安装_tomcat(Java服务器)

Tomcat(Java服务器工具)是一款十分优质的Java服务器软件。在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。对于一个初学者来说&#xff0c;可以这样认为&#xff0c;当在一台机器上配置好Apache 服务器&#xff0c;可利用它响应…

管道通信

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 什么是管道&#xff1f; 管道是单向的、先进先出的&#xff0c;它把一个进程的输出和另…

Linux 终端下 dstat 监控工具

dstat 是一个可以取代vmstat&#xff0c;iostat&#xff0c;netstat和ifstat这些命令的多功能产品。dstat克服了这些命令的局限并增加了一些另外的功能&#xff0c;增加了监控项&#xff0c;也变得更灵活了。dstat可以很方便监控系统运行状况并用于基准测试和排除故障。dstat可…

运用HTML5+CSS3和CSS滤镜做的精美的登录界面

原始出处http://chenjinfei.blog.51cto.com/2965201/774865<!DOCTYPE HTML> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312"> <meta http-equiv"description" content"运用C…

MyEclipse使用总结——MyEclipse文件查找技巧 ctrl+shift+R ctrl+H

一、查找文件 使用快捷键【ctrlshiftR】弹出弹出文件查找框&#xff0c;如下图所示&#xff1a; 二、查找包含某个字符串的文件 使用快捷键【ctrlH】在弹出对话框中选File Search选项&#xff0c;然后在第一个文本框中粘贴&#xff08;我一般用粘贴&#xff09;或自已手动录入&…