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;
};