一  无向图单源最短路径,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的更多相关文章

  1. python数据结构与算法——图的最短路径(Dijkstra算法)

    # Dijkstra算法——通过边实现松弛 # 指定一个点到其他各顶点的路径——单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, ...

  2. python数据结构与算法——图的最短路径(Floyd-Warshall算法)

    使用Floyd-Warshall算法 求图两点之间的最短路径 不允许有负权边,时间复杂度高,思路简单 # 城市地图(字典的字典) # 字典的第1个键为起点城市,第2个键为目标城市其键值为两个城市间的直 ...

  3. python数据结构与算法——图的最短路径(Bellman-Ford算法)解决负权边

    # Bellman-Ford核心算法 # 对于一个包含n个顶点,m条边的图, 计算源点到任意点的最短距离 # 循环n-1轮,每轮对m条边进行一次松弛操作 # 定理: # 在一个含有n个顶点的图中,任意 ...

  4. Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  5. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  6. 图的最短路径-----------Dijkstra算法详解(TjuOj2870_The Kth City)

    做OJ需要用到搜索最短路径的题,于是整理了一下关于图的搜索算法: 图的搜索大致有三种比较常用的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 Dijkst ...

  7. 图的最短路径——dijkstra算法和Floyd算法

    dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...

  8. 图的最短路径Dijkstra

    #include <stdio.h> #include <string.h> #include <vector> #include <queue> #i ...

  9. python数据结构与算法——图的基本实现及迭代器

    本文参考自<复杂性思考>一书的第二章,并给出这一章节里我的习题解答. (这书不到120页纸,要卖50块!!,一开始以为很厚的样子,拿回来一看,尼玛.....代码很少,给点提示,然后让读者自 ...

随机推荐

  1. HTML学习---HTML状态码

    301 Moved Permanently 永久移动.请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI.今后任何新的请求都应使用新的URI代替302 Found ...

  2. Gdb调试工具/ Makfile项目管理

    gdb调试工具 gcc -g main.c -o main 常用命令 命令            简写         作用 help                h            按模块列 ...

  3. iOS自动化-- 常用iOS命令

    iOS命令: 获取设备的的UDID idevice_id --list # 显示当前所连接设备的 udid instruments -s devices # 列出所有设备,包括真机.模拟器.mac i ...

  4. Foj 2296 Alice and Bob(博弈、搜索)

    Foj 2296 Alice and Bob 题意 两个人博弈,规则如下:轮流取0~9中的数字,最后Alice所得的数字个数为1~n中,数位在Alice所取集合中出现奇数次的. 双方想获得尽量多,问A ...

  5. Redis的数据类型及其常用命令

    快速入门Redis 首先安装redis: windows下安装redis Linux下安装redis 1. 什么是redis Redis属于nosql(非关系型数据库) 关系型数据库是基于关系表的数据 ...

  6. Kali-linux查看打开的端口

    对一个大范围的网络或活跃的主机进行渗透测试,必须要了解这些主机上所打开的端口号.在Kali Linux中默认提供了Nmap和Zenmap两个扫描端口工具.为了访问目标系统中打开的TCP和UDP端口,本 ...

  7. git编译安装报错 http-push.c:20:19: 警告:expat.h:没有那个文件或目录

    解决: [root@hdoop3 git-2.18.1]# yum install expat-devel

  8. sql语句查询知识点

    LEFT JOIN    关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行 INNER JOIN   INNER JOIN 关键字在表中存在至少一个匹 ...

  9. Yum 下载安装包及对应依赖包

    Yum 下载安装包及对应依赖包: 安装该软件:yum install -y yum-plugin-downloadonly 以下载 openssh-server 为例 yum install -y o ...

  10. CDN的作用与基本过程

     转载请注明出处: leehao.me 或 https://blog.csdn.net/lihao21/article/details/52808747 简介 CDN,Content Distribu ...