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