• 【ACM程序设计】求最短路 Dijkstra算法


    Dijkstra算法

    dijstra算法也是基于贪心的思想,用于求一个点到所有其他点的最短距离的算法。

    流程:

    • (1)建立两个集合分别表示已经找到最小值的点(已经到达)和没有找到最小值的点(没有到达)。(初始时所有点都没有找到)。再建立一个表示该点到起点的距离的数组。(初始时所有点都没有到起点的路径,表示为-1)
    • (2)将起点置入已经找到最小值的点,将距离标记为零,然后将与该点有直接路径的点的距离更新。
    • (3)找到未到达的点中距离最小的点,将其置入已到达的点,重复步骤(2),直到更新完所有的点。

    若dist[v]比dist[vpre]+MGraph[vpre][v]大则:更新dist[v]为dist[vpre]+MGraph[vpre][v],更新path[v]为Vpre。

    void Dijkstra(int n, float MGraph[][n], int v0, int dist[], int path[])
    {
    	int set[maxSize];
    	int min, v;
        //初始化dist path set数组
    	for (int i = 0; i < n; i++)
    	{
    		dist[i] = MGraph[v0][i];
    		set[i] = 0;
    		if (MGraph[v0][i] < INF)
    			path[i] = v0;
    		else
    			path[i] = -1;
    	}
    	set[v0] = 1; path[v0] = -1;
        
        //对剩余的每个顶点做处理 只需要处理n-1次
    	for (int i = 0; i < n - 1; i++)
    	{
            //选一个离当前顶点最近的没有并入的点 把它作为当前顶点
    		min = INF;
    		for (j = 0; j < n; j++)
    			if (set[j] == 0 && dist[j] < min)
    			{
    				v = j;
    				min = dist[j];
    			}
    		set[v] = 1;
            //关键步骤
    		for (int j = 0; j < n; j++)
    		{
    			if (set[j] == 0 && dist[v] + MGraph[v][j] < dist[j])
    			{
    				dist[j] = dist[v] + MGraph[v][j];
    				path[j] = v;
    			}
    		}
    	}
    }
    
  • 相关阅读:
    Navicat for MySQL下载、安装与破解
    javaweb之Cookie学习
    static特别用法【静态导包】——Java包的静态导入
    面试感悟----一名3年工作经验的程序员应该具备的技能
    致孩子
    java中的代码块是什么意思,怎么用
    ModelAttribute用法之一
    SpringMVC获取页面数据乱码的解决get/post
    总结过去10年的程序员生涯 (经验)---大神的建议
    hdu 5237 二进制
  • 原文地址:https://www.cnblogs.com/tavee/p/16244316.html
Copyright © 2020-2023  润新知