单源最短路Dijstra算法
Dijstra算法是寻找从某一顶点i出发到大其他顶点的最短路径。Distra算法的思想与Prim算法很像,它收录顶点的规则是按照路径长度递增的顺序收录的。设v0是源顶点,我们要寻找从v0出发到其他任意一点的最短路径。设已经求解的顶点(已经找到从v0出发到达该顶点最短路径的顶点)组成的集合是S={v0,v1,...vk};在收录下一个顶点v的时候要么是(v0,v),要么是(v0,vj,v);如果是后者,则一定有vj∈S,这一点很容易用反正法证明。Dijstra算法的时间复杂度是O(V^2),若是稀疏图改用邻接表存储,使用最小堆时间复杂度是O(ElogV).具体代码如下(这里假设图是连通的),有相应的解释:
#include<iostream>
using namespace std;
#define MAX_SIZE 100
#define MAX_NUMBER INT_MAX/2
struct Graph {
int V, E;
int w[MAX_SIZE][MAX_SIZE];
};
bool visit[MAX_SIZE];
int dis[MAX_SIZE];
int parent[MAX_SIZE];
void Dijstra(Graph G, int i); //顶点i为出发点到其他点最短距离
void PrintPath(int j);
int main() {
int i, j,w,k;
Graph G;
for (i = ; i < MAX_SIZE; i++)
for (j = ; j < MAX_SIZE; j++)
G.w[i][j] = (i == j ? :MAX_NUMBER); //对角线设置为0,其它设置为无穷
cin >> G.V >> G.E;
for (k=; k< G.E; k++) {
cin >> i >> j >> w;
G.w[i][j] = G.w[j][i]=w;
}
Dijstra( G, );
for (i = ; i < G.V; i++)
printf("%d %d\n",i, dis[i]);
PrintPath(); //打印顶点6的路径
return ;
}
void Dijstra(Graph G, int i) {
int k, j,pos,min;
memset(visit, , sizeof(visit)); //初始化
for (j = ; j < G.V; j++)
dis[j] = MAX_NUMBER; //首先将距离都设置为无穷大
j = i;
dis[j] = ; //到自身距离为0
parent[j] = -; //i是父节点
visit[j] = ; //首先将顶点i本身收录
for (i = ; i < G.V; i++) {
for (k = ; k < G.V; k++) { //更新上次收录的顶点j对其他顶点的影响
if (!visit[k] && dis[k]>=dis[j] + G.w[j][k]) {//这里G.w[j][k]在之前初始化不要设置为INT_MAX,否则dis[j]+G.w[j][k]
//可能会超过int的范围。
dis[k] = dis[j] + G.w[j][k];
parent[k] = j;
}
}
pos = j, min =MAX_NUMBER;
for (k = ; k < G.V; k++) {
if (!visit[k] && min>dis[k]) {
pos = k;
min = dis[k];
}
}
j = pos;
visit[j] = ; //将j收录
}
}
void PrintPath(int j) {
if (j== -)
return;
PrintPath(parent[j]);
printf("%d ", j);
}
单源最短路Dijstra算法的更多相关文章
- 单源最短路——Bellman-Ford算法
1.Dijkstra的局限性 Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的. 列如以 ...
- 单源最短路——dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问 ...
- 图论-单源最短路-SPFA算法
有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...
- 单源最短路 Bellman-Ford算法(有向图)
// 单源最短路问题 // Bellman-Ford算法 // 复杂度O(V*E) //! 可以判断负圈 #include <cstdio> #include <iostream&g ...
- 单源最短路dijkstra算法&&优化史
一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...
- 单源最短路Dijkstra算法——matlab实现
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...
- 单源最短路(Dijkstra算法)
#返回上一级 @Author: 张海拔 @Update: 2015-03-11 @Link: http://www.cnblogs.com/zhanghaiba/p/3514570.html Dijk ...
- 单源最短路——SPFA算法(Bellman-Ford算法队列优化)
spfa的算法思想(动态逼近法): 设立一个先进先出的队列q用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路 ...
- 单源最短路——Dijkstara算法
算法基本思想:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径. 1.将所有的顶点分为两个部分:已知最短路程的顶点集合P和未知最短路径的顶点集合Q 2.设置 ...
随机推荐
- 利用js阻止表单提交
(1) return false <form name="loginForm" action="login.aspx" method="post ...
- Monkey log异常分析说明
以下主要针对在Android-Phone项目中进行Monkey log进行分析和说明,可以对bug提交作为参考. 要求熟悉,应用的包名.也就是说那个应用包出现问题,该属于那个模块,应用包名是判断依据. ...
- python-侦测系统
大概就是这样 要求 告警需要一定之间内出现多次 然后才报警一次 如果恢复 必须发送恢复的信息
- import from 相对路径
项目目录 - server - static - src - - stroe - - router - - main.js - app.js src为前端文件,src目录下有main.js代码如下 i ...
- sass和postcss
sass是css预处理器 需要安装node-sass支持 核心是c++编写 集成 sass-loader 把scss装换成css css-loader 找出@import和url()导入的语法,告诉w ...
- Python数据结构之列表
1.Python列表是Python内置的数据结构对象之一,相当于数组 2.列表用[] 包含,内有任意的数据对象,每一个数据对象以 ,逗号分隔,每隔数据对象称之为元素 3.Python列表是一个有序的序 ...
- 程序员编写API遵循法则
Api理解: 1.遵循函数.数据库字段命名规则 2.思考项目的远景(扩展性) 3.思考团队调用是否方便及舒服 4.思考是否有灵动性
- 【winform】基于UserControl实现webBrower组件时html页面元素加载及onclick事件监听实现
[背景]基于System.Windows.Forms.UserControl实现的webBrower组件在html内使用window.external调用winform事件失败. [解决思路]借助wi ...
- Linux 一个sysv 脚本参考模板
说明: 1.很多时候我们的服务都是通过源码包编译安装,但是有的源码包编译完成后并不提供该服务的sysv风格脚本,我们只能手动执其二进制程序+配置文件 2.如果服务器宕机或重启,就不能自动完 ...
- 《30天学习30种新技术》-Day 15:Meteor —— 从零开始创建一个 Web 应用
目录:https://segmentfault.com/a/1190000000349384 原文: https://segmentfault.com/a/1190000000361440 到目前为止 ...