Dijkstra的heap优化

为了将最小费用最大流的spfa优化,决定将spfa换成heap优化的Dijkstra。

所以还得现学。。。

stl大法好。

——附带码

 1 #include <cstdio>
 2 #include <queue>
 3 #include <cstring>
 4 #define Heap pair<int, int>
 5
 6 using namespace std;
 7
 8 const int INF = 2147483647;
 9 int n, m, t, cnt;
10 int next[1000001], to[1000001], val[1000001], head[10001], dis[10001];
11 priority_queue <Heap, vector <Heap>, greater <Heap> > q;
12
13
14 inline void add(int a, int b, int c)
15 {
16     to[cnt] = b;
17     val[cnt] = c;
18     next[cnt] = head[a];
19     head[a] = cnt++;
20 }
21
22 inline void Dijkstra(int s)
23 {
24     int i, v;
25     Heap u;
26     for(i = 1; i <= n; i++) dis[i] = INF;
27     dis[s] = 0;
28     q.push(make_pair(0, s));
29     while(!q.empty())
30     {
31         u = q.top();
32         q.pop();
33         if(u.first != dis[u.second]) continue;
34         for(i = head[u.second]; i != -1; i = next[i])
35         {
36             v = to[i];
37             if(dis[v] > dis[u.second] + val[i])
38             {
39                 dis[v] = dis[u.second] + val[i];
40                 q.push(make_pair(dis[v], v));
41             }
42         }
43     }
44 }
45
46 int main()
47 {
48     int i, j, a, b, c, s;
49     scanf("%d %d %d", &n, &m, &s);
50     memset(head, -1, sizeof(head));
51     for(i = 1; i <= m; i++)
52     {
53         scanf("%d %d %d", &a, &b, &c);
54         add(a, b, c);
55     }
56     Dijkstra(s);
57     for(i = 1; i <= n; i++) printf("%d ", dis[i]);
58     return 0;
59 }

时间: 2024-12-22 01:10:19

Dijkstra的heap优化的相关文章

dijkstra算法及其优化

dijkstra算法是经典的贪心算法.基本的想法是,有两个集合S和E,开始S集合中只有一个起点,E集合中有剩下的其他点.遍历E集合中的所有点,找出与起点距离最近的一个点,将其加入集合S,并用该点去更新起点到其他点的最短路径. 由动图结合上面的思路,我们可以看出,算法的基本框架是: 1 1.初始化 2 for i(0 -> n - 1) 3 { 4 2.找出距离起点最近的点 5 3.标记该点加入集合S 6 4.用新加入集合S的点去更新起点到其他点的最短距离 7 } 1.其中初始化包括了距离数组di

POJ 3268 Silver Cow Party 最短路—dijkstra算法的优化。

POJ 3268 Silver Cow Party Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads connects

POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n.树根为编号1,选择一些边.使得全部节点构成一棵树.选择边的代价是(子孙的点的重量)×(这条边的价值). 求代价最小多少. 分析: 单看每一个点被计算过的代价,非常明显就是从根到节点的边的价值.所以这是个简单的单源最短路问题. 只是坑点还是非常多的. 点的数量高达5w个,用矩阵存不行.仅仅能用边存. 还

POJ 1511 Invitation Cards 【最短路,spfa算法,Dijkstra算法堆优化】

Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 25219   Accepted: 8346 Description In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They wan

Dijkstra+优先队列 堆优化

代码 #include <cstdio> #include <queue> #include <vector> #define MAXN 200010 #define INF 0x3fffffff using namespace std; struct edge{ int v,w; edge(int v, int w):v(v),w(w){} }; vector <edge> mp[MAXN]; int dis[MAXN]; bool vis[MAXN];

【模板】prim的heap优化

简单的代码.. 时间复杂度为O((n + m)logn) 大部分情况下还是跑不过kruskal的,慎用. 1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 #define heap pair<int, int> 5 6 using namespace std; 7 8 int n, m, cnt, ans; 9 int head[5001], to[400001], next[4000

Dijkstra算法堆优化(vector建图)

#include<iostream> #include<algorithm> #include<string.h> #include<stdio.h> #include<queue> #include <vector> #include <map> int s,t; int n,m; using namespace std; const int INF=99999999; struct Node{ int to; int

最短路的几种算法及其优化(模板)

一.Dijkstra 算法 dijkstra算法适用于边权为正的情况,求单源最短路,适用于有向图和无向图 模板伪代码: 清除所有点的标号 设d[0]=0,其余d[i]=INF: 循环n次{ 在所有未标记的节点中,寻找d[i]最小的点x 给x做标记 对于从x出发的所有边(x,y)更新d[y]=min(d[y],d[x]+w[x,y]); } memset(v,0,sizeof(v)); for(int i=0;i<n;++i) d[i]=(i==0?0:INF); for(int i=0;i<n

Heap+Dijkstra堆优化的Dijkstra

前面说到"原生的Dijkstra",由于Dijkstra采用的是贪心策略,在贪心寻找当前距离源结点最短的结点时需要遍历所有的结点,这必然会导致效率的下降,时间复杂度为n^n.因此当数据量较大时会消耗较长时间.为了提高Dijkstra的效率,只有对Dijkstra的贪心策略进行改进. 由于Dijkstra采用的贪心策略是每次寻找最短距离的结点并将其放入存放所有已知最短距离结点的S集合中,可以联想到堆以及优先级队列这些数据结构,这些结构都能非常高效地提供当前状态距离最短的结点.实践也可以证