一  无向图单源最短路径,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. [转发]CPU个数、CPU核心数、CPU线程数

    我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之说,下面文本就来解释一下CPU的核心数与 ...

  2. Matlab基础 数组

    一.引用 数组元素引用,下标从1开始 如y(3)表示第3个元素 二.扩充 扩充2*3矩阵为3*3矩阵,并且给a(3,3)赋值为9 三.提取 数组按列存储 全下标变化为单下标: sub2ind((m,n ...

  3. Android启动外部应用的方法

    1.根据package的名称获取应用的Launch Intent Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage ...

  4. C++课堂作业(2)

    github的链接: https://github.com/deepYY/object-oriented/tree/master/PAT.1025 题目 给定一个常数K以及一个单链表L,请编写程序将L ...

  5. [19/04/14-星期日] 网络编程_java.net包(InetAddress类、InetSocketAddress类、URL类)

    一.概念 Java为了可移植性,不允许直接调用操作系统,而是由java.net包来提供网络功能.Java虚拟机负责提供与操作系统的实际连接. InetAddress    作用:封装计算机的IP地址和 ...

  6. [Python 多线程] RLock可重入锁 (九)

    RLock 可重复锁,是线程相关的锁.同样是线程相关的还有threading.local. 线程A获得可重用锁,并可以多次成功获取,不会阻塞.最后要再线程A中和acquire次数相同的release. ...

  7. ES6标准入门 字符串的扩展

    1:模板字符串与模板引擎 https://blog.csdn.net/crper/article/details/52940625 es6模板字符串中标签模板作为参数时产生空元素的问题 https:/ ...

  8. ethersjs运行时出现的问题

    1.在运行部署在ganache1.1.0上的合约中的某个函数时,出现了这样的问题,之前部署在geth上时并没有这样的问题 userdeMacBook-Pro:test-ethers user$ nod ...

  9. ethereumjs/ethereumjs-vm-2-API文档

    https://github.com/ethereumjs/ethereumjs-vm/blob/master/docs/index.md vm.runBlockchain Processes blo ...

  10. SpringBoot实战(十)之使用Spring Boot Actuator构建RESTful Web服务

    一.导入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...