#include <iostream> #include <cstdlib> #include <utility> #include <queue> using namespace std; typedef pair<int, int> P; int main() { // zero means no connection int graph[5][5] = { 0, 1, 5, 0, 0, 0, 0, 3,10, 9, 0, 0, 0, 5, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, }; priority_queue<pair<P, P>, vector<P>, greater<P> > que; vector<int> vd(5, INT_MAX); // min distance from source to each vertex que.push(make_pair(0, 0)); // start from 0 vd[0] = 0; while (!que.empty()) { P cv = que.top(); que.pop(); if (cv.second != vd[cv.first]) continue; for (int i=0; i<5; i++) { if (cv.first == i || graph[cv.first][i] == 0) continue; int dst = graph[cv.first][i] + vd[cv.first]; if (dst < vd[i]) { vd[i] = dst; que.push(make_pair(i, dst)); } } } for (int i=0; i<5; i++) cout<<i<<":"<<vd[i]<<endl; system("pause"); return 0; }
求单源最短路径,只能处理没有负边的情况,因为它假设每次从上一个最近节点扫描(与它相邻的节点)中都可以获得下一个最近的节点(有负边的话,可能在其他的扫描中该节点可以有更短的距离),这里使用优先队列从候选节点中获得这个最近节点