最短路径算法 SP
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
const int N=;
const int INF=0x3f3f3f3f;
int p[N][N],d[N],path[N]; ///path数组用于记录路径 void dijkstra(int sec,int n) ///sec为出发节点,n表示图中节点总数
{
int i,j,min,min_num;
int vis[N]={,};
for(i=;i<n;i++)
{
d[i]=p[sec][i];
}
vis[sec]=;d[sec]=;
for(i=;i<n;i++)
{
min=INF;
for(j=;j<n;j++)
{
if(!vis[j]&&d[j]<min)
{
min=d[j];
min_num=j;
}
}
vis[min_num]=;
for(j=;j<n;j++)
{
if(!vis[j]&&d[j]>min+p[min_num][j])
{
path[j]=min_num;
///path[j]记录d[j]暂时最短路径的最后一个中途节点min_num,
///表明d[j]最后一段从节点min_num到节点j
d[j]=min+p[min_num][j];
}
}
}
}
void print(int sec,int n) ///sec为出发节点,n表示图中节点总数
{
int i,j;
stack<int> q; ///由于记录的中途节点是倒序的,所以使用栈(先进后出),获得正序
for(i=;i<n;i++) ///打印从出发节点到各节点的最短距离和经过的路径
{
j=i;
while(path[j]!=-) ///如果j有中途节点
{
q.push(j); ///将j压入堆
j=path[j]; ///将j的前个中途节点赋给j
}
q.push(j);
printf("%d=>%d, length:%d, path: %d ",sec,i,d[i],sec);
while(!q.empty()) ///先进后出,获得正序
{
printf("%d ",q.top());///打印堆的头节点
q.pop(); ///将堆的头节点弹出
}
printf("\n");
}
}
int main()
{
memset(path,-,sizeof(path));///将path数组初始化为-1
int i,j,n=;
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
p[i][j]=(i==j?:INF);
}
}
///p[0][1]=10;p[0][3]=30;p[1][2]=50;p[1][4]=100;p[2][4]=5;p[3][2]=20;p[3][4]=60;p[4][5]=10;//p[i][j]表示节点i到节点j的距离
/*p[0][1]=10;p[1][0]=10;p[1][2]=1;p[2][1]=1;
p[2][4]=4;p[4][2]=4;p[0][3]=2;p[3][0]=2;p[3][2]=1;p[2][3]=1;
p[3][4]=7;p[4][3]=7;*/
p[][]=;p[][]=;
p[][]=;p[][]=;
p[][]=;p[][]=;
p[][]=;p[][]=;p[][]=;p[][]=;
dijkstra(,n); ///求从节点0出发到各节点的最短距离
print(,n); ///打印从节点0出发到各节点的最短距离和路径
return ;
}
最短路径算法 SP的更多相关文章
- 加权图的最小生成树、最短路径算法 - java实现
加权图相关算法 前言 本文主要介绍加权图算法中两个重要应用:最小生成树和最短路径. 求最小生成树时针对的是加权无向图,加权有向图的最小生成树算法成为"最小属树形图"问题,较为复杂, ...
- Johnson 全源最短路径算法
解决单源最短路径问题(Single Source Shortest Paths Problem)的算法包括: Dijkstra 单源最短路径算法:时间复杂度为 O(E + VlogV),要求权值非负: ...
- Floyd-Warshall 全源最短路径算法
Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,即全源最短路径问题(All-Pairs Shortest Paths Probl ...
- Dijkstra 单源最短路径算法
Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...
- Bellman-Ford 单源最短路径算法
Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Leste ...
- 几大最短路径算法比较(Floyd & Dijkstra & Bellman-Ford & SPFA)
几个最短路径算法的比较:Floyd 求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3). Floyd-Warshall算法(Floyd ...
- 带权图的最短路径算法(Dijkstra)实现
一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...
- 无向图的最短路径算法JAVA实现
一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...
- 最短路径算法之Dijkstra算法(java实现)
前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...
随机推荐
- ORB-SLAM 代码笔记(五)Frame类
Frame类的成员变量主要包含从摄像头获取的图像的 1. 特征点信息(关键点+描述字) 2. 尺寸不变特征所用金字塔信息,这些都定义在ORBextractor对象中 3. 词袋模型参数,用于跟踪失败情 ...
- linux安装oracle远程客户端
文章参考:http://blog.csdn.net/caomiao2006/article/details/11901123 感谢博友分享O(∩_∩)O~ 安装oracle 远程客户端(一般情况下本地 ...
- 在spring+beranate中多数据源中使用 ThreadLocal ,总结的原理 --费元星
设计模式 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问 ...
- ACE_Select_Reactor_T 介绍 (2)
本章目录 ACE_Select_Reactor_T 介绍 类继承图 类协作图 类主要成员变量 事件处理函数调用图 事件处理主流程 handle_events 函数流程 handle_events_i ...
- windows中vim以及cmder的使用
虽然有gvim,但是我依然更喜欢控制台(可理解为博主的偏执已经发展到某个阶段). windows自带的控制台很糟糕,尤其是我正在用的win7竟然没有全屏功能.任何一个占领屏幕的图标显然是不可忍受的. ...
- React开发时候注意点
JSX 使用jsx的使用,用一个{}包裹起来,例如 const method = {<div> 123 </div>} 使用()小括号,防止分号自动插入 const eleme ...
- mysql字段名与关键字重复解决办法
mysql 关键字与字段名相同,插入或者修改里会报错 解决办法: 1.改字段名,如果库里面表结构关系不复杂,修改字段名就解决 2.在插入或者修改字段时,字段名加上 ` 包上,注意:这里不是引号,是英 ...
- 问题 A: 分数矩阵
题目描述 我们定义如下矩阵:1/1 1/2 1/31/2 1/1 1/21/3 1/2 1/1矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增.请求出这个矩阵的总和. 输入 输入包含多组测 ...
- sql between and 边界问题
1.不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的.需要自己测试 2.一般情况下.SQL Server中 between and是包括边界值的,not between不包括边界 ...
- hadoop节点之间通信问题
前天遇到一个hadoop问题,由于之前都是伪分布的情况,没有真正的涉及到集群的环境,最近按照一些资料自己搭建了一个集群环境,三台虚拟机,一个master,两个slave,利用jps查看节点信息,启动了 ...