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 代码有误, 需要判断一个点是否两次被加入队列
                    
                
                
            
        
浙公网安备 33010602011771号