zoukankan      html  css  js  c++  java
  • 单源最短路径 -dijkstra

    单源最短路径,dijkstra 算法,邻接阵形式,复杂度O(n^2)
    计算正权图的单源最短路(Single Source Shortest Path,源点给定,通过该算法可以求出起点到所有点的最短路),
    它是基于这样一个事实:
    如果源点到x点的最短路已经求出,并且保存在d[x] ( 可以将它理解为D(s, x) )上,那么可以利用x去更新x能够直接到达的点的最短路。

    //单源最短路径,dijkstra 算法,邻接阵形式,复杂度 O(n^2)
    //求出源 s 到所有点的最短路经,传入图的顶点数 n,(有向)邻接矩阵 mat
    //返回到各点最短距离 min[]和路径 pre[],pre[i]记录 s 到 i 路径上 i 的父结点,pre[s]=-1
    //可更改路权类型,但必须非负!
    #define MAXN 200
    #define inf 1000000000
    typedef int elem_t;		//可更改路权类型,但必须非负!
    void dijkstra(int n, elem_t mat[][MAXN], int s, elem_t* min, int* pre) {
    	int v[MAXN], i, j, k;
    	for (i = 0; i < n; i++)
    		min[i] = inf, v[i] = 0, pre[i] = -1;
    	for (min[s] = 0, j = 0; j < n; j++) {
    		for (k = -1, i = 0; i < n; i++)
    			if (!v[i] && (k == -1 || min[i] < min[k]))
    				k = i;
    		for (v[k] = 1, i = 0; i < n; i++)
    			if (!v[i] && min[k] + mat[k][i] < min[i])
    				min[i] = min[k] + mat[pre[i] = k][i];
    	}
    }
    
  • 相关阅读:
    P3688 [ZJOI2017] 树状数组 【二维线段树】
    CF516D Drazil and Morning Exercise【并查集,结论】
    Luogu5540 最小乘积生成树
    CDW数学小笔记
    ZROI 金华集训 线性代数选讲
    多项式乘法(代码)
    我的vimrc
    P4562 [JXOI2018]游戏
    [POJ3585]Accumulation Degree
    [CH5302]金字塔
  • 原文地址:https://www.cnblogs.com/CSE-kun/p/14049379.html
Copyright © 2011-2022 走看看