该算法对于稠密图更加有效:

对于给出具有非负权重的边和源顶点S的图G,算法可在O(mlogn)时间内找出从s点到其他每一个顶点的距离。

如果图是稠密的,即对于某个ε>0,m>=n^(1+ε),可以被改善在O(m/ε)内执行。(m为图的边数,n为图的定点数)

最小堆模板:

 jfdkjfks
 struct HeapElement {
// key存储顶点序号,value存储到该顶点的最短距离
int key, value;
};
struct MinHeap {
HeapElement heap[MAXN];
int position[MAXN];
int size; // 顶点数
void init() {
heap[size=].value = -INF;
memset(position, , sizeof(position));
}
void insert(int key, int value) {
heap[++size].key = key;
heap[size].value = value;
position[key] = size;
siftUp(size);
}
void decrease(int index) {
int x = heap[index].value;
int y = heap[size].value;
-- size;
if (index == size+)
return; swap(heap[index], heap[size+]);
if (y >= x) {
siftDown(index);
} else {
siftUp(index);
}
}
int delmin() {
int x = heap[].key;
decrease();
return x;
}
void siftUp(int index) {
while (index > ) {
if (heap[index].value < heap[index/].value) {
swap(heap[index],heap[index/]);
} else {
break;
}
index /= ;
}
}
void siftDown(int index) {
while (index* <= size) {
index *= ;
if (index < size && heap[index].value > heap[index+].value) {
++ index;
}
if (heap[index].value < heap[index/].value) {
swap(heap[index],heap[index/]);
} else {
break;
}
}
}
void makeHeap() {
for (int i = size/; i > ; -- i)
siftDown(i);
}
void swap(HeapElement &a, HeapElement &b) {
HeapElement temp = a;
a = b;
b = temp;
int tmp = position[a.key];
position[a.key] = position[b.key];
position[b.key] = tmp;
}
}H;

代码实现:(hdu2544)

#include <iostream>
#define INF 0x7FFFFFFF
using namespace std; const int SIZE = 105;
int dist[SIZE];
int G[SIZE][SIZE];
bool vis[SIZE];
struct HeapElement {
int key, value;
};
void swap(HeapElement &ha, HeapElement &hb) {
int key = ha.key;
int value = ha.value;
ha.key = hb.key;
ha.value = hb.value;
hb.key = key;
hb.value = value;
};
// 使用邻接表储存图,线性表储存堆
struct MinHeap {
HeapElement heap[SIZE];
int n; // 顶点数 void makeheap() {
for (int i = n/2; i > 0; -- i)
siftDown(i);
};
void siftUp(int index) {
int k = index;
while (k > 1) {
if (heap[k].value < heap[k/2].value) {
swap(heap[k],heap[k/2]);
} else {
break;
}
k /= 2;
}
};
void siftDown(int index) {
int k = index;
while (k*2 <= n) {
k *= 2;
if (k < n && heap[k].value > heap[k+1].value) {
++ k;
}
if (heap[k].value < heap[k/2].value) {
swap(heap[k],heap[k/2]);
} else {
break;
}
}
};
void insert(HeapElement element) {
heap[++n] = element;
siftUp(n);
};
void decrease(int index) {
int x = heap[index].value;
int y = heap[n].value;
n -= 1; // 若删除节点位于最末位置,则删除成功,无需其他操作。
if (index == n+1)
return; heap[index] = heap[n+1];
if (y >= x) {
siftDown(index);
} else {
siftUp(index);
}
};
int decreaseMin() {
int x = heap[1].key;
decrease(1);
return x;
};
}H; void dijkstra(int src, int n) {
int i, j, w;
bool flag; for (i = 1; i <= n; ++ i) {
if (G[i][src] != INF) {
dist[i] = G[src][i];
HeapElement h = {i, dist[i]};
H.insert(h);
} else {
dist[i] = INF;
}
} memset(vis, false, sizeof(vis));
vis[src] = true;
dist[src] = 0; for (i = 1; i < n; ++ i) { int node = H.decreaseMin();
vis[node] = true; for (w = 1; w <= n; ++ w) {
flag = false;
if (!vis[w] && G[node][w] != INF) {
if (dist[node] < dist[w] - G[node][w]) {
dist[w] = dist[node] + G[node][w]; }
for (j = 1; j <= H.n; ++ j) {
if (H.heap[j].key == w) {
H.heap[j].value = dist[w];
flag = true;
break;
}
} if (!flag) {
HeapElement h = {w, dist[w]};
H.insert(h);
} else {
H.siftUp(j);
}
}
}
}
}; void init(int n) {
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= n; ++ j)
G[i][j] = INF;
H.n = 0;
}; int main()
{
int N, M, a, b, c; //freopen("C:\\Users\\Smile\\test.txt","r",stdin);
//freopen("C:\\Users\\Smile\\out.txt", "w", stdout); while (scanf("%d%d",&N,&M)!=EOF, N&&M) {
init(N); for (int i = 0; i < M; ++ i) {
scanf("%d%d%d",&a,&b,&c);
if (G[a][b] > c) {
G[a][b] = c;
G[b][a] = c;
}
} dijkstra(1, N); printf("%d\n",dist[N]);
}
}

  

hud2544dijkstra+堆优化的更多相关文章

  1. uva10986 堆优化单源最短路径(pas)

    var n,m,s,t,v,i,a,b,c:longint;//这道题的代码不是这个,在下面 first,tr,p,q:..]of longint; next,eb,ew:..]of longint; ...

  2. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  3. 堆优化的Dijkstra

    SPFA在求最短路时不是万能的.在稠密图时用堆优化的dijkstra更加高效: typedef pair<int,int> pii; priority_queue<pii, vect ...

  4. codeforces 449B Jzzhu and Cities (Dij+堆优化)

    输入一个无向图<V,E>    V<=1e5, E<=3e5 现在另外给k条边(u=1,v=s[k],w=y[k]) 问在不影响从结点1出发到所有结点的最短路的前提下,最多可以 ...

  5. POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化

    昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...

  6. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  7. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  8. Dij的堆优化

    #include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #i ...

  9. BZOJ 3040 最短路 (堆优化dijkstra)

    这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...

随机推荐

  1. Maven学习之 仓库镜像

    使用仓库镜像 仓库可以声明在项目中,但有时,你可能想要使用某个仓库的镜像,而不去修改项目文件. 使用镜像的原因: 有一个同步镜像,且速度更快. 想使用你自己控制的内部仓库. 想运行repository ...

  2. [转]Caffe在Linux下的安装,编译,实验

    Caffe在Linux下的安装,编译,实验  原文地址:http://www.cnblogs.com/evansyang/p/6150118.html 第一部分:Caffe 简介 caffe是有伯克利 ...

  3. zz---Tomcat服务器下部署项目几种方式

    http://blog.sina.com.cn/s/blog_550281c60101hvrs.html 一.静态部署1.直接将web项目文件件拷贝到webapps 目录中     Tomcat的We ...

  4. mybatis 关联查询 association

    <resultMap id="DutyPersonAndFileAndScoreMap" type="com.cares.asis.duty.entity.Duty ...

  5. C# 字符串替换Replace

    C# 中的石strA.Replace(strB,strC)函数可以实现将strA中的strB替换为strC. 但是容易出错的地方是,这并不是就直接替换好了,此函数的返回值才是替换好的字符串,所以还要要 ...

  6. VPN断线原因解析- ADSL惹的祸

    在我们使用VPN的时候,最讨厌的就是无故的断线了,可能正在和好基友一起副本,或者正在视频热聊中,还或者youtube视频看的正起劲,突然windows一个对话框弹出 - “连接已经断开”.实在是太影响 ...

  7. 360极速浏览器UA怪异以及如何用js判断360浏览器

    本文最后一次更新于7个月前,文章内容可能略有出入.若发现文章中有错误之处,可以留言评论告诉作者. 1.360极速浏览器UA因域名不同而异 今天在写一个判断浏览器.浏览器版本.操作系统.操作系统版本.浏 ...

  8. vagrant nginx php开发环境中浏览器访问js文件,文件中出现乱码的解决方法

    当nginx配置 sendfile设置为on时,某些js文件中会出现奇怪的字符: ����������������� 不管怎么刷新,重启服务都无效: 通过google搜索之后发现原来是因为开启send ...

  9. css3动画属性(transitions:property duration timing transition-delay)

    transitions:property duration timing-function; transitionst他有三个参数:1) property:属性设置,例如background,colo ...

  10. Postman-简单使用

    Postman-简单使用 Postman-进阶使用 Postman-CI集成Jenkins Postman功能(https://www.getpostman.com/features) 主要用于模拟网 ...