数据结构与算法-图的最短路径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块!!,一开始以为很厚的样子,拿回来一看,尼玛.....代码很少,给点提示,然后让读者自 ...
随机推荐
- 三、python小功能记录——杀掉进程
import os os.system("taskkill /F /IM python.exe")#旧版 os.system("taskkill /F /IM py.ex ...
- 【转】网络管理员必知之:IP地址划分
1.IP地址分类 IP地址有四个段,包括网络标识和主机标识两部分:netid+hostid. IP地址应用分为A.B.C三类,D.E类是保留和专用的. ...
- eclipse直接使用tomcat安装程序的webapp目录调试
感谢此文:http://blog.csdn.net/soszou/article/details/23673133 本文很多技术及操作来源于此文 需求:因为微信方面的开发调试.为了测试方便,直接构建了 ...
- 安装SCOM Reporting Server
在SQL群集计算机上可以安装SCOM Reporting Server. 1.运行SQL Server安装程序,选择 全新安装SQL Server,不能向已有的群集实例中添加Reporting Ser ...
- Asp.Net MVC源码调试
首先下载MVC源代码,下载地址为:https://aspnetwebstack.codeplex.com/ 打开项目,卸载test文件夹下的所有项目和System.Web.WebPages.Admin ...
- December 18th 2016 Week 52nd Sunday
May your love soar on the wings of a dove in flight. 愿你的爱乘着飞翔中的白鸽,展翅高飞. May my life soar on the wing ...
- 020.2.5 Calender对象
内容:日历对象获取时间,设置时间,日期偏移 通过工厂化获得对象.getInstance();get() 获取时间信息 Calendar c = Calendar.getInstance(); //获取 ...
- easy_encode_decode
s = input("输入:") result = '' for i in range(len(s)): result += chr(ord(s[i])^2000) print(r ...
- 操作dict时避免出现KeyError的几种方法
在读取dict的key和value时,如果key不存在,就会触发KeyError错误,如: Python t = { ', ', ', } print(t['d']) 就会出现: <code c ...
- 【[HEOI2016/TJOI2016]字符串】
码农题啊 上来先无脑一个\(SA\)的板子,求出\(SA\)和\(het\)数组 我们只需要从\(sa[i]\in[a,b]\)的所有\(i\)中找到一个\(i\)使得\(sa[i]\)和\(rk[c ...