数据结构与算法-图的最短路径Dijkstra
一 无向图单源最短路径,Dijkstra算法
计算源点a到图中其他节点的最短距离,是一种贪心算法。利用局部最优,求解全局最优解。
设立一个visited访问和dist距离数组,在初始化后每一次收集一个当前最短的节点cur并将其标记为visited,然后更新这个节点的未被收集临近节点的dist值 [ if ( visited[t] != True && (dis[cur]+ Graph[cur][t]) < dis[t] ) ],直到所有节点被访问。查找dist中的最短路径节点,可使用最小堆或二项堆,降低时间复杂度。

二
/* Dijkstra of shortest path of single source in graph */ #include <stdio.h>
#define MAX 100
/* int as +/-[2^31] --> 0-2147483647 */
#define INFIN 2147483647
enum BOOL {
False, True
}; int Graph[MAX][MAX]; /* matrix of graph */
int dis[MAX]; /* distance from origin other nodes */
BOOL visited[MAX]; void Dijkstra( int v0 , int N); int main(int argc, char *argv[])
{
int i, j, k;
int N, M, src, dst, distance;
int start; /* input vertex number and edge number */
scanf("%d%d", &N, &M);
/* Initialize the vertax and edge of graph matrix */
for ( i = ; i < N; i++ ) {
for ( j = ; j < N; j++ ) {
if ( i == j ) {
/* edge of vertax itself*/
Graph[i][j] = ;
} else {
/* all edge large than 0, unless it's unkonwn */
Graph[i][j] = INFIN;
}
}
} /* Init the orignal graph edge */
printf("Please input the init edge\n");
for ( k = ; k < M; k++ ) {
scanf("%d%d%d", &src, &dst, &distance);
Graph[src][dst] = distance;
} printf("Please input the start vertax:");
scanf("%d", &start);
if ( start >= ) {
Dijkstra( start, N);
printf("Distance from %d to others as follows:\n", start);
printf("src --> dst\n"); for ( k = ; k < N; k++ ) {
printf("%d-->%d cost:%d ", start, k, dis[k]);
if ( k > && (k % ) == ) {
printf("\n");
} }
}
return ;
} void Dijkstra( int v0, int N )
{
/* Init dis */
int i, j, k, t; /* cur represent current vertax */
int cur, mini_dis;
for ( i = ; i < N; i++ ) {
dis[i] = Graph[v0][i];
visited[i] = False;
}
cur = v0;
visited[v0] = True;
mini_dis = INFIN; /* find dis to another MAX-1 points */
for ( j = ; j < N; j++ ) {
/* for simple use,iterate the array to find a shortest*/
for ( k = ; k < N; k++ ) {
if ( visited[k] != True &&
dis[k] < mini_dis ) {
mini_dis = dis[k];
cur = k;
}
}
visited[cur] = True; /* Update the correlated dis with current shortest point */
for ( t = ; t < N; t++ ) {
if ( Graph[cur][t] < dis[t] ) {
/* update if dis to [cur veratx + edge] < [dis to t] */
if ( visited[t] != True &&
(dis[cur]+ Graph[cur][t]) < dis[t] ) {
dis[t] = dis[cur] + Graph[cur][t];
}
}
}
}
}
数据结构与算法-图的最短路径Dijkstra的更多相关文章
- python数据结构与算法——图的最短路径(Dijkstra算法)
# Dijkstra算法——通过边实现松弛 # 指定一个点到其他各顶点的路径——单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, ...
- python数据结构与算法——图的最短路径(Floyd-Warshall算法)
使用Floyd-Warshall算法 求图两点之间的最短路径 不允许有负权边,时间复杂度高,思路简单 # 城市地图(字典的字典) # 字典的第1个键为起点城市,第2个键为目标城市其键值为两个城市间的直 ...
- python数据结构与算法——图的最短路径(Bellman-Ford算法)解决负权边
# Bellman-Ford核心算法 # 对于一个包含n个顶点,m条边的图, 计算源点到任意点的最短距离 # 循环n-1轮,每轮对m条边进行一次松弛操作 # 定理: # 在一个含有n个顶点的图中,任意 ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...
- 图的最短路径-----------Dijkstra算法详解(TjuOj2870_The Kth City)
做OJ需要用到搜索最短路径的题,于是整理了一下关于图的搜索算法: 图的搜索大致有三种比较常用的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 Dijkst ...
- 图的最短路径——dijkstra算法和Floyd算法
dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...
- 图的最短路径Dijkstra
#include <stdio.h> #include <string.h> #include <vector> #include <queue> #i ...
- python数据结构与算法——图的基本实现及迭代器
本文参考自<复杂性思考>一书的第二章,并给出这一章节里我的习题解答. (这书不到120页纸,要卖50块!!,一开始以为很厚的样子,拿回来一看,尼玛.....代码很少,给点提示,然后让读者自 ...
随机推荐
- My personal website:http://47.94.240.229:8080/yjh/project/
My personal website: http://47.94.240.229:8080/yjh/project/
- 无法用Put方式请求发布在IIS中的WebAPI
WebApi程序发布到IIS上后,无法使用Put的方式进行请求,错误信息如下: 原因和解决方案: 在IIS中默认不支持Put请求和Delete请求,因为IIS中注册的Web ...
- BT提权wind2008R2
昨天中午打开电脑,对着菜刀在那翻啊翻,找到一个64bit的os. 因为这个ip不在曾经提权过的主机列表里面,心想这应该是个低权限的网站,顺手打个whoami试试,结果给我返回了"nt aut ...
- BZOJ 1015 星球大战starwar 逆向并查集
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1015 题目大意: 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个 ...
- 【[APIO2010]巡逻】
\(APIO\)的题就是非常难啊 首先看到\(k=1\)的情况,显然我们只需要找到一条直径把这条直径的两端连起来就好了 因为我们连这一条新边的实质是使得这一条链上的边不需要重复经过了,我们想让走的边尽 ...
- 包不包含__declspec(dllimport)的判定
按照MSDN说明,当链接dll的导出函数时,只需要包含头文件和lib,__declspec(dllimport)修饰符不是必须的,但加上该修饰能使导出函数的调用效率更高.那么,究竟原因是什么? 不使用 ...
- 利用memcached实现分布式锁
一 需求场景: (1) 需要限制用户创建提现订单的频率:目的一是防止前端bug引起的用户重复提交:二是防止并发攻击绕过提现策略(第一次提现和第二次提现门槛可能不同). (2) 需要限制秒杀下同一用户 ...
- 跨路径读取cookie
同域下,即使设置了cookie的路径还是能将不同路径cookie读出来. 1.在/ctf/day3/ 目录设置一个cookie 2.其他目录下是不能访问这个cookie的 3.通过iframe可以实现 ...
- 4、RabbitMQ-消息应答与消息持久化
消息应答( Message acknowledgment) 1. Message acknowledgment(消息应答) 执行任务可能需要几秒钟.你可能想知道如果其中一个消费者开始一项长期任务并且只 ...
- (转)ci
1 从代码管理器签出源文件 2 修改代码 3 编译代码 4 遇到错误,转到2继续修改直到达到预期 5 运行单元测试,期望所有的测试绿色(通过) 6 单元测试出错,转入2 7 重构代码,按 ...