算法学习 - Dijkstra(迪杰斯特拉)算法学习

Dijkstra算法

其实Dijkstra是单源点最短路径的基础算法,这个算法的目的就是找到一个图中的某个点V到这个图中其他点的最短路径。

条件


  • 有向图
  • 没有负权值路径

时间复杂度:O(E) + O(V^2) = O(V^2)
当图是稠密的时候和稀疏的时候时间复杂度还是有点差别的。

原理

原理是这样的,首先最开始所有节点都是未知的,距离未知,初始化起始节点的距离为0, 其他节点都是不可达(用最大整数,或者-1表示)。然后每次找到所有未知节点中距离最小的那个节点(minNode 节点),标记为已知,已这个节点为起始,松弛所有挨着它的节点。

依次类推,每次都找所有未知节点中距离最小的节点。标记为已知,然后松弛操作。

代码实现

其实这个还挺简单的,单源点最短路径还有一个Bellman-Ford算法,以后在写,比较简单。

Dijkstra算法:

//
//  main.cpp
//  Dijkstra
//
//  Created by Alps on 15/3/4.
//  Copyright (c) 2015年 chen. All rights reserved.
//

#include <iostream>

#ifndef NumVertex
#define NumVertex 4 //定义图的顶点数量
#endif

#ifndef Infinity
#define Infinity 10000 //定义权值最大值
#endif

using namespace std;

typedef int  Vertex;

struct LinkList{ //定义邻接链表
    int val;
    int length;
    LinkList * next;
    LinkList(int v): val(v), next(NULL) {}
};

typedef LinkList* List;

struct TableEntry{ //定义结构体用来实现算法。
    List Header;
    bool Know;
    int Dist;
    Vertex Path;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值