Dijisktra 算法详解 及模板
要求及作用范围
Dijisktra算法用于求单源最短路径,对图的要求有:
权值不为负
算法思路
将顶点集分成两部分S、V-S,S为已经找到到源点最短路的顶点集合。
1.将源点插入S,到自身距离为0;
2.遍历刚插入节点的所有边,更新V-S中顶点到源点的距离;
3.在V-S中找到距源点最短的结点,插入S,回到第2步。若未找到1.结点遍历完2.无路径
C语言实现(有向图)
**
1. 邻接表实现
**
时间复杂度:O(n^2)
#include<stdio.h>
#include<stdlib.h>
#define size 10000
#define sup 100000000
struct tnode {
int num;
int wei;
struct tnode* next;
};
typedef struct tnode node;
node graph[size];//邻接链表
int dis[size], flag[size],parent[size];//顶点到源结点距离
void initial(int n, int root) {
int i;
for (i = 0; i <= n; i++) {
graph[i].next = NULL;
dis[i] = sup;//到源点距离初始化为极大值
}
dis[root] = 0;//源点到自身距离为0
}
void insert(int u, int v, int wei) {
node* p = (node*)malloc(sizeof(node)), * q = &graph[u];
p->next = q->next, p->num = v, p->wei = wei;
q->next = p;
}
void relax(int u, int v, int w) {
//松弛操作,更新V-S中点到源点距离
if (dis[v] > dis[u] + w) {
parent[v] = u;//设置v的前一个结点
dis[v] = dis[u] + w;
}
}
void dijisktra(int root, int n) {
int min = sup, tmpi, i;
node* tmp;
while (1) {
min = sup;
for (i = 1; i <= n; i++) {
if (flag[i] == 0 && min > dis[i