数据结构与算法-图的最短路径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块!!,一开始以为很厚的样子,拿回来一看,尼玛.....代码很少,给点提示,然后让读者自 ...
随机推荐
- CentOS 6 系统启动流程
第一阶段: BIOS启动引导 主板加电,系统自动载入BIOS(Basic Input Output System)系统 BIOS载入CMOS,读取CMOS中设定的硬件工作参数 BIOS进行POST自检 ...
- HTTP协议图--与 HTTP 协作的 Web 服务器
HTTP 通信时,除客户端和服务器外,还有一些用于协助通信的应用程序.如下列出比较重要的几个:代理.缓存.网关.隧道.Agent 代理. 1.代理 代理 HTTP 代理服务器是 Web 安全.应用 ...
- linux setup 相关text mode图形配置工具的安装
centos 6.4 x86_64 minimal安装后发现setup命令不可用 yum update yum install setup 安装完了还是不可用,不知为什么,难道装的那个包不对?yum ...
- LoadRunner 测试Socket接口函数说明
lrs_save_param_ex是lrs_save_param的扩展函数,包含了lrs_save_param的基本功能.其函数语法结构如下: int lrs_save_param_ex ( char ...
- mac使用指南--软件安装部分
最近因为开发需要,换了个mac,发现和Windows下面的操作和习惯真是千差万别啊,在这里记录一下,有需要的也可以参考一下. 安装前强烈建议根据个人习惯设置好触控板!!!什么单击双击选中拖拽的统统设好 ...
- jq模仿h5 placeholder效果
$(".pay-license input").on("input propertychange blur",function(){ if($(this).va ...
- Tableau10.4中智能显示点击后消失的解决方案
如果你的电脑是Win10,并且是高分屏,可能会出现和我一样的问题,就点击智能显示后,发现找不到了. 那么解决方案就是: 这样就能找到智能显示了.
- mysql-5.5 for linux源代码安装
mysql-5.5 for linux源代码安装 1.使用Yum安装依赖软件包 # yum install -y gcc gcc-c++ gcc-g77 autoconf automake bison ...
- UVa 11971 - Polygon(几何概型 + 问题转换)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- nextjs-demo
这个是根据nextjs服务端渲染做的一个小demo 关键性代码,主要是控制模态框显示隐藏 关于index页面 //index.js /* eslint-disable jsx-a11y/anchor- ...