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

对于给出具有非负权重的边和源顶点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. 获取WINDOW.OPEN url js中的get取值

    function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)( ...

  2. jquery 滚动到底部加载

    var body_ = $(window); var indexPage = 2; var pageCount = <?php echo $pageCount;?>; var _ajaxR ...

  3. PHP 常用字符串函数整理

    PHP语言中的字符串函数也是一个比较易懂的知识.今天我们就为大家总结了将近12种PHP字符串函数,希望对又需要的朋友有所帮助,增加读者朋友的PHP知识库. 1.查找字符位置函数 strpos($str ...

  4. iOS.ReactNative-2-bridge-and-react-native-app-execution

    Bridge and React Native App Execution 基于0.18.1 Async batched bridge used to communicate with the Jav ...

  5. HDU 2689Sort it 树状数组 逆序对

    Sort it Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  6. 解析Tomcat内部结构和请求过程

    Tomcat Tomcat的组织结构 由Server.xml的结构看Tomcat的体系结构 Tomca的两大组件:Connecter和Container Connecter组件 Container组件 ...

  7. 1029. Median (25)

    分析: 考察归并排序,用简单的快排会超时. #include <iostream> #include <stdio.h> #include <algorithm> ...

  8. freeCodeCamp:Truncate a string

    截断一个字符串! 如果字符串的长度比指定的参数num长,则把多余的部分用...来表示. 切记,插入到字符串尾部的三个点号也会计入字符串的长度. 但是,如果指定的参数num小于或等于3,则添加的三个点号 ...

  9. js之文档对象的设置(DOM)

    1.对象文本: 对象.innerHTML;   对象.innerHTML=""; 对象.innerText; 对象.innerText=""; 2.对象属性: ...

  10. 获得select下拉框的值

    html -------------------------------------------------------------------------------------- <sele ...