zoukankan      html  css  js  c++  java
  • Dijkstra算法 简易理解(原创)

    算法思想:

      将所有顶点分为 两个阵营 [S]和[V-S],其中[S]是已经确定下最小路径的点,[V-S]是待确定最短路径的点
      不断地以[S]中的某个点作为中间点,改变[V-S]中某个点的路径。

    代码如下:

    #include "pch.h"
    #include <iostream>
    using namespace std;
    
    void Dijkstra(int s,int n,int m);
    void init_dij(void);
    const int MAXV = 50, INF = 999999;
    int S[MAXV];
    int path[MAXV];
    int arcs[MAXV][MAXV];//临界矩阵,代表两点间距离
    int dist[MAXV];//每个顶点的最短距离
    
    int main()
    {
    	init_dij();
    	arcs[0][1] = 1; arcs[0][3] = 4; arcs[0][4] = 4;
    	arcs[1][3] = 2; arcs[2][5] = 1; arcs[3][2] = 2;
    	arcs[3][4] = 3; arcs[4][5] = 3;
    	for (int i = 0; i < 6; i++) {
    		arcs[i][i] = 0;
    	}
    	Dijkstra(0,6,8);
    	for (int i = 0; i < 6; i++) {
    		cout << dist[i] << endl;
    		cout << endl;
    	}
    	for (int i = 0; i < 6; i++) {
    		cout << path[i] << " ";
    	}
    }
    
    void init_dij() {
    	fill(S, S + MAXV, 0);//标记全置0
    	for (int i = 0; i < MAXV; i++) {
    		for (int j = 0; j < MAXV; j++)arcs[i][j] = INF;
    	}
    }
    void Dijkstra(int s,int n,int m) {
    	path[s] = s;//起点设置:认为他前置点为起点本身
    	for (int i = 0; i < n; i++) {//初始化所有点先连向起始点
    		if (arcs[s][i] != INF)path[i] = s;
    	}
    	for (int i = 0; i < n; i++) {
    		dist[i] = arcs[s][i];//初始化dist为从起始点s至第i个点的距离
    	}
    	S[s] = 1;//将初始点放入到S中
    
    	for (int i = 0; i < n; i++) {//进行n次循环
    		int MIN = INF;
    		int temp=-1;
    		for (int j = 0; j < n; j++) {//从[V-S]中寻找到dist最小的点
    			if (S[j] == 0 && dist[j] < MIN && dist[j]!=INF) {
    				MIN = dist[j];
    				temp = j;
    			}
    		}
    		if (temp != -1) {
    			S[temp] = 1;
    			//修改[V-S]中各顶点的路径:以刚才选中的点作为中间桥梁
    			for (int k = 0; k < n; k++) {
    				if (S[k] == 0 &&  dist[temp] + arcs[temp][k] < dist[k]) {
    					//对于[V-S]中的点,以temp做中间点后的路径长度变小,则发生替换
    					dist[k] = dist[temp] + arcs[temp][k];//修改第k个点的dist
    					path[k] = temp;
    					//然后下一轮循环时,它会作为该顶点的新属性,与其他点竞选,如果他是最小的则选入S
    				}
    			}
    		}
    	}
    }
    

      

  • 相关阅读:
    嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
    嵌入式Linux驱动开发之helloword心得
    PJMEDIA之录音器的使用(capture sound to avi file)
    PJMEID学习之视频的捕捉与播放
    PJSIP-PJMEDIA【使用pjmedia 播放wav格式的音乐】
    PJSIP-PJLIB-Socket
    PJSIP-PJLIB(samples) (the usage of the pjlib lib) (eg:string/I/O)
    Start with PJSIP on windows
    Android实际开发之网络请求组件的封装(OkHttp为核心)
    Android实际开发中的首页框架搭建(二、首页框架实现)
  • 原文地址:https://www.cnblogs.com/qujunhui/p/10878900.html
Copyright © 2011-2022 走看看