最短路算法之 Dijkstra算法
Dijkstra算法
Dijkstra算法是典型最短路算法,用于计算一个节点到其它全部节点的最短路径。
主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解。但因为它遍历计算的节点非常多,所以效率低。
Dijkstra算法是用来求随意两个顶点之间的最短路径。在该算法中。我们用邻接矩阵来存储图。在该程序中设置一个二维数组来存储随意两个顶点之间的边的权值。能够将随意一个图的信息通过键盘输入,让后在输入要查找的两个顶点。程序能够自己主动求出这两个顶点之间的最短路径。
算法思想
s为源。Map[u,v] 为点u 和v 之间的边的长度,结果保存在 dis[];
初始化:源的距离dis[s]设为0。其它的点距离设为无穷大,同一时候把全部的点状态设为没有扩展过。
循环n-1次:
1. 利用标记变量数组 在没有扩展过的点中取一距离最小的点u。并将其状态设为已扩展。
2. 对于每一个与u相邻的点v,假设dis[u] + Map[u,v] < dis[v]。那么把dist[v]更新成更短的距离dis[u] + Map[u,v] 。
此时到点v的最短路径上,前一个节点即为u。
结束:此时对于随意的u,dist[u]就是s到u的距离。
附 Hdu 2544 最短路
做题思想
建立一个Map的二维数组 里面的初始值改为一个INF(大数) 把从A到B 的路径长度储存进去
建立一个Dis 的数组 储存Map[ s ][ 0 →n ]里的数据 循环N-1次 每次标记一个dis中最小的标号 并用
if(!flag[i] && dis[i]>dis[t] + Map[t][i]) 该标号更新Dis 数组
更新过后 dis[ x ] 即为源点S的到x 的最短距离
代码
#include<stdio.h> // Dijkstra 算法
#include<iostream>
#include<string.h>
#define INF 10000000
using namespace std;
int Map[101][101],dis[110];
int n ,m;
void Dijkstra()
{
int i,j,D = 0;
bool flag[110];
memset(flag,0,sizeof(flag)); //标记数组
for(i=1; i<=n; i++)
dis[i]=Map[1][i]; //与1处的距离 每个i代表自身与1的距离
for(i=1; i<n; i++) //每次循环标记一个点 一共标记n-1个点
{
int temp = INF;
for(j=1; j<=n; j++) //找出dis数组中的最小的那个值 位置用D记录下来
if(!flag[j]&&dis[j]<temp)
{
temp = dis[j];
D = j;
}
flag[D] = 1; //把该点标记
for(j=1; j<=n; j++) //更新dis数组 以D
{
if(!flag[j]&&dis[j] > Map[D][j]+dis[D])
dis[j] = Map[D][j]+dis[D];
}
}
}
int main()
{
int i,j,x,y,z;
while(scanf("%d %d",&n,&m)!=EOF&&(m||n))
{
for(i=0; i<101; i++) { //地图清空初始化为一个大数
for(j=0; j<101; j++)
Map[i][j] = INF;
Map[i][i]=0;
}
for(i=1; i<=m; i++)
{
cin >> x >> y >> z; //输入
if(Map[x][y] > z) //假设再次输入的 比之前的小,覆盖
Map[x][y]=Map[y][x] = z;
}
Dijkstra();
printf("%d\n",dis[n]); //所有循环过后,dis【n】的值即为从1到n 的距离;
}
return 0;
}
附:
ACM假期集训感悟:
一转眼半个月过去了,上午听师哥讲算法。看书;下午刷题,总结;
别人都说我们程序员苦,累;另一个外号 “屌丝程序员”。
可我并不这么觉得,每天学习算法锻炼思维,刷题提高代码能力和逻辑思维
在ACM训练中,最开心的时候就是花老长时间去改错。WA一遍又一遍,最终该出了最后一个BUG ,AC!
心情就无比的舒畅,看窗外的树叶是那样的翠绿,天是那样的蔚蓝。
在大学生活中能过的如此充实。有动力。有目标,朝着目标一步一步的走去。 是多么幸福的一件事
在这里。送出我的一句话:
整个世界填满不了十八岁男孩子的雄心和梦。
最短路算法之 Dijkstra算法的更多相关文章
- 【hdu 2544最短路】【Dijkstra算法模板题】
Dijkstra算法 分析 Dijkstra算法适用于边权为正的情况.它可用于计算正权图上的单源最短路( Single-Source Shortest Paths, SSSP) , 即从单个源点出发, ...
- 最短路径算法(Dijkstra算法、Floyd-Warshall算法)
最短路径算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径的问题.适合使用Dijkstra算法. 确定终点的最短路径问题:即已知终结结点,求最短路径的问题.在无向图中,该问题与确 ...
- 数据结构与算法系列研究七——图、prim算法、dijkstra算法
图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...
- 算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
一.名称 动态规划法应用 二.目的 1.贪婪技术的基本思想: 2.学会运用贪婪技术解决实际设计应用中碰到的问题. 三.要求 1.实现基于贪婪技术思想的Prim算法: 2.实现基于贪婪技术思想的Dijk ...
- 最短路算法之Dijkstra算法通俗解释
Dijkstra算法 说明:求解从起点到任意点的最短距离,注意该算法应用于没有负边的图. 来,看图. 用邻接矩阵表示 int[][] m = { {0, 0, 0, 0, 0, 0}, {0, 0, ...
- 最短路径算法之Dijkstra算法(java实现)
前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...
- 最短路经算法简介(Dijkstra算法,A*算法,D*算法)
据 Drew 所知最短路经算法现在重要的应用有计算机网络路由算法,机器人探路,交通路线导航,人工智能,游戏设计等等.美国火星探测器核心的寻路算法就是采用的D*(D Star)算法. 最短路经计算分静态 ...
- 非负权值有向图上的单源最短路径算法之Dijkstra算法
问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度.求解该问题的算法一般为Dijkstra算法. 假设图顶点个数为n,则针对 ...
- 【算法】Dijkstra算法(单源最短路径问题)(路径还原) 邻接矩阵和邻接表实现
Dijkstra算法可使用的前提:不存在负圈. 负圈:负圈又称负环,就是说一个全部由负权的边组成的环,这样的话不存在最短路,因为每在环中转一圈路径总长就会边小. 算法描述: 1.找到最短距离已确定的顶 ...
随机推荐
- 双网卡只有一个能ping通的解决办法
来源:http://blog.csdn.net/centerpoint/article/details/38542719 Linux默认启用了反向路由检查 如果2个网卡在一个Lan里面,那么服务器可能 ...
- maven学习(五)——maven命令的组合使用
Maven的命令组合使用 maven的编译,清理,测试,打包,部署命令是可以几个命令同时组合起来使用的,常用的命令组合如下: 1.先清理再编译:"mvn clean compile" ...
- 【转】一个java页游服务器框架
源地址:http://www.cnblogs.com/metoy/p/4305326.html?utm_source=tuicool&utm_medium=referral 一.前言 此游戏服 ...
- P4555 最长双回文串
题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 n的串 S ,求 S的最长双回文子串 T ,即可将 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10835 Accepted: 6 ...
- 数组洗牌算法-shuffle
数组洗牌,最近直接的想法是从数组随机取出一个元素,放到另一个数组中,但是这样取出的元素会有重复,必须采取一定的方法保证: 1. 元素不能重复2. 元素被抽取的概率相等,即随机性 数组洗牌经典算法有两种 ...
- Codeforces Round #364 (Div. 2) C 二分处理+求区间不同字符的个数 尺取法
C. They Are Everywhere time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- 【转】利用ScriptManager实现Javascript调用WebService中的方法
原文发布时间为:2009-07-01 -- 来源于本人的百度文章 [由搬家工具导入] 前台调用后台方法,或者后台调用前台方法。ScriptManager实现 开发过程中,总想在前台直接调用后台的met ...
- luogu 1258 小车问题 小学奥数(?)
题目链接 题意 甲.乙两人同时从A地出发要尽快同时赶到B地.出发时A地有一辆小车,可是这辆小车除了驾驶员外只能带一人.已知甲.乙两人的步行速度一样,且小于车的速度.问:怎样利用小车才能使两人尽快同时到 ...
- IPC最快的方式----共享内存(shared memory)
在linux进程间通信的方式中,共享内存是一种最快的IPC方式.因此,共享内存用于实现进程间大量的数据传输,共享内存的话,会在内存中单独开辟一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限 ...