/**
再写一篇睡觉,正好把刚刚的优先队列用下。。
前面再说单源最短路径的时候用到dijkstra 算法,现在介绍下
它的优化版,传说中的 O(N*log(E))
废话不多说,还是那句话:模板都会用,关键在转换
*/
struct {
int v, w, next;
}edge[2*eMax]; // 无向边
int edgeHead[nMax], dis[nMax], vis[nMax];
//nMax 点个数 eMax 边个数
struct node {
int u, dis;
bool operator < (const node &a) const {
return a.dis < dis;
}//head重载 < ,以 dis 从小到大排列
};
int dijkstra() {
int i;
for (i=1; i<=n; i++) { //点个数
dis[i] = inf; vis[i] = false;
}
dis[1] = 0; //假设源点为1 算了
priority_queue<node> que; //stl 优先队列
node = temp;
temp.u = 1; temp.dis = 0;
que.push(temp);
while (!que.empty()) {//实在没的优化就加个 count < n
int u = que.top().u;
que.pop();
if (vis[u]) continue;
vis[u] = true;
for (i=edgeHead[u]; i!=0; i=edge[i].next) {
int v = edge[i].v;
if (!vis[v] && dis[v] > dis[u] + edge[i].w) {
dis[v] = dis[u] + edge[i].w;
temp.u = v; temp.dis = dis[v];
que.push(temp);
}
}
}
return dis[n]; //则dis[n] 就为 1-n 的最短路径
}
int main() {
//添边前面多次用过,还是老格式
//添好边直接调用
//点为 1 - n
dijkstra();
return 0;
}
收藏于 2012-01-08
来自于百度空间
单源最短路 dijkstra + heap 实现
原文作者:Dijkstra算法
原文地址: https://blog.csdn.net/zcube/article/details/48222883
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/zcube/article/details/48222883
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。