zoukankan      html  css  js  c++  java
  • SPFA, Dijkstra 代码实现

    这里给出了 Bellmanford 和 SPFA 的算法思想和伪代码, 但这离具体的实现还有差距, 最短路径算法的使用频率很高, 有必要总结一下

    1. SPFA 算法

    算法的核心是: 松弛有效的操作必然发生在松弛前导节点成功松弛的节点上

    /*
     * spfa.h
     *
     *  Created on: Apr 8, 2014
     *      Author: sangs
     */
    
    #ifndef SPFA_H_
    #define SPFA_H_
    #include <queue>
    using namespace std;
    
    extern class Edge;
    const int MAXNUM = 1000;
    int dist[MAXNUM];
    int father[MAXNUM];
    int mark[MAXNUM];
    vector<Edge> graph[MAXNUM];
    
    void spfa(int st, int ed) {
    	queue<int> record;
    	record.push(st);
    	dist[st] = 0;
    	father[st] = -1;
    
    	while(!record.empty()) {
    		int u = record.front().index;
    		record.pop();
    
    		for(int i = 0; i < graph[u].size(); i ++) {
    			int v = graph[u][i].index;
    			if(dist[u] + graph[u][i].cost < dist[v]) {
    				record.push(v);
    				father[v] = u;
    				dist[v] = dist[u] + graph[u][i].cost;
    			}
    		}
    	}
    
    	for(int i = ed; i != -1; i = father[i]) {
    		mark[i] = 1;
    	}
    }
    
    
    #endif /* SPFA_H_ */
    

      

    2. Dijkstra 算法

    代码的核心是对 visited 赋值在外面, 这样能够保证 st->ed 的路径是最短的

    /*
     * Dijkstra.h
     *
     *  Created on: Apr 8, 2014
     *      Author: sangs
     */
    
    #ifndef DIJKSTRA_H_
    #define DIJKSTRA_H_
    
    extern class Node;
    const int MAXNUM = 1000;
    bool visited[MAXNUM];
    /*
     * Always used to calculate the shortest path/length to specific node
     */
    void dijkstra(int st, int ed) {
    	priority_queue<int> record;
    
    	record.push(st);
    
    	while(!record.empty()) {
    		int u = record.top();
    		
    		while(!record.empty()) {
    			Node v = record.top();
    			record.pop();
    			visited[v.index] = true;
    			if(v == ed) {
    				break;
    			}
    			
    			for(int i = 0; i < graph[v.index].size(); i ++) {
    				if(visited(...)) continue;
    				
    				record.push_back(Node(...));
    			}
    		}
    	}
    }
    
    
    #endif /* DIJKSTRA_H_ */
    

      

    2014年4月18日21:51:42

    上面的 SPFA 代码有误, 需要判断一个点是否两次被加入队列

  • 相关阅读:
    全面解析Vue.nextTick实现原理
    js 宏任务和微任务
    模拟实现ES6的set类
    git客户端出现libpng warning: iCCP: known incorrect sRGB profile
    js封装、继承
    js单例模式
    并行运行多个python虚拟机
    关于场景服务的一些想法
    关于不能对闭包函数进行热更新的问题
    Python string interning原理
  • 原文地址:https://www.cnblogs.com/zhouzhuo/p/3652132.html
Copyright © 2011-2022 走看看