文档章节

Dijkstra算法的粗略学习

syaokun219
 syaokun219
发布于 2014/06/06 00:16
字数 445
阅读 183
收藏 6
# -*- coding: utf-8 -*-
#########################################################################
# Author: Yao Kun
# Created Time: 5/6/2014 PM 3:51:35
# File Name: dijkstra.py
# Description: 
#########################################################################
print "dijkstra"
INFINITE = 10000
# 打印邻接矩阵
def print_adj(adj):
    # 用于按行输出的临时string变量
    print "adj matrix --> "
    for row in adj:
        str_row = ""
        for ele in row:
            str_row += str(ele) + "\t"
        print str_row, "\n"
# 找到指定下标集合的最小值
def find_min(lst, allow_lst):
    tmp_min = INFINITE
    index = -1
    for i in range(0, len(lst)):
        if lst[i] < tmp_min and allow_lst[i] != 0:
            tmp_min = lst[i]
            index = i
    return index
# ori代表初始源点
def dijkstra(S, D, adj, dist, ori, point_num):
    print "Core Alg"
    
    # 这样表示的更容易理解
    path = []
    # 初始化D集合和dist集合,dist集合记录到某点的最小距离
    for i in range(0, point_num):
        if i == ori:
            dist.append(0)
        else:
            dist.append(INFINITE)
        path.append([ori])
        D.append(-1)
    # print "dist :", dist
    # print "D :", D
    # 一直循环直到S集合满
    while len(S) < point_num:
        # u代表当前正准备处理的顶点,取得最小值,然后并把这个点从D集合中取出
        u = find_min(dist, D)
        D[u] = 0
        # 添加u点到S集中
        S.append(u)
        for v in range(0, point_num):
            if adj[u][v] != INFINITE and D[v] != 0:
                # Relax 步骤
                if(dist[v] > dist[u] + adj[u][v]):
                    dist[v] = dist[u] + adj[u][v]
                    # 记录路径,删除原来的路径,将到u的路径和点v假如到新的路径中
                    path[v] = []
                    for i in range(0, len(path[u])):
                        path[v].append(path[u][i])
                    
                    path[v].append(v)
                   
    return path
# 单源点集合
S = []
D = []
# 保存到各个顶点距离的最小长度
dist = []
# 邻接矩阵
adj = [
    [INFINITE,    10,           INFINITE,       30,             100],
    [INFINITE,    INFINITE,     50,             INFINITE,       INFINITE],
    [INFINITE,    INFINITE,     INFINITE,       INFINITE,       10],
    [INFINITE,    INFINITE,     20,             INFINITE,       60],
    [INFINITE,    INFINITE,     INFINITE,       INFINITE,       INFINITE]
]
print_adj(adj)
path = dijkstra(S, D, adj, dist, 1, 5)
print path


© 著作权归作者所有

共有 人打赏支持
syaokun219
粉丝 1
博文 4
码字总数 3017
作品 0
海淀
Dijkstra算法|单源最短路径|贪心算法

单愿最短路径描述:给定带权有向图G=(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称之为源(origin)。现在要计算从源到其他各顶点的最短路径的长度。这里的路径长度指的是到...

掬一捧
2012/09/26
0
0
基于图论数据关联方法的目标跟踪

目标跟踪方法包括生成类方法和判别类方法。与生成类方法最大的区别是,判别类方法分类器采用机器学习,训练中用到了背景信息,这样分类器就能专注区分前景和背景,所以判别类方法普遍都比生成...

韦德爱老詹
04/27
0
0
像名字一样容易忘记的Dijkstra

Dijkstra算法是经典的求解一个顶点到其他顶点的最短距离的算法。每次学习的时候总是觉得思路简单明了,但每当要用到时,就忘记了实现的细节。归根结底还是应用的少。相信做地图导航的应该对其...

dugangabc
2016/02/06
0
0
28个不得不看的经典编程算法

转载自:28个不得不看的经典编程算法 第一名:Union-find 严格地说,并查集是一种数据结构,它专门用来处理集合的合并操作和查询操作。并查集巧妙地借用了树结构,使得编程复杂度降低到了令人...

xjhznick
2014/11/06
0
0
理解Dijkstra算法

学习过最短路径问题的人都不会不知道Dijkstra算法。这个算法适用于解决无负权图的单源最短路径问题。这篇小文来谈谈如何理解这一算法。 这里首先给出一个Python 3的代码实现(以下代码出自P...

桥头堡2015
2016/08/19
219
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
0
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
2
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部