Dijkstra堆优化与SPFA模板

Dijkstra+优先队列

#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
    return x*f;
}
const int maxn=100010;
const int maxm=1000010;
struct Dijkstra {
    int n,m,first[maxn],next[maxm],done[maxn],d[maxn];
    struct Edge {int from,to,dist;}edges[maxm];
    struct HeapNode {
        int d,u;
        bool operator < (const HeapNode& ths) const {return d>ths.d;}
    };
    void init(int n) {
        this->n=n;m=0;
        memset(first,0,sizeof(first));
    }
    void AddEdge(int u,int v,int w) {
        edges[++m]=(Edge){u,v,w};next[m]=first[u];first[u]=m;
    }
    void solve(int s) {
        priority_queue<HeapNode> Q;
        memset(done,0,sizeof(done));
        for(int i=1;i<=n;i++) d[i]=1000000000;
        d[s]=0;Q.push((HeapNode){0,s});
        while(!Q.empty()) {
            int x=Q.top().u;Q.pop();
            if(done[x]) continue;done[x]=1;
            for(int i=first[x];i;i=next[i]) {
                Edge& e=edges[i];
                if(d[e.to]>d[x]+e.dist) {
                    d[e.to]=d[x]+e.dist;
                    Q.push((HeapNode){d[e.to],e.to});
                }
            }
        }
    }
}sol;
int main() {
    int n=read(),m=read();sol.init(n);
    for(int i=1;i<=m;i++) {
        int u=read(),v=read(),w=read();
        sol.AddEdge(u,v,w);
    }
    sol.solve(1);
    for(int i=1;i<=n;i++) printf("%d ",sol.d[i]);
    return 0;
}
/*
7 8
1 3 5
1 4 2
1 5 1
4 3 2
3 6 2
4 6 3
6 7 3
5 7 1
*/

SPFA

#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
    return x*f;
}
const int maxn=100010;
const int maxm=1000010;
struct SPFA {
    int n,m,first[maxn],next[maxm],inq[maxn],d[maxn];
    struct Edge {int from,to,dist;}edges[maxm];
    void init(int n) {
        this->n=n;m=0;
        memset(first,0,sizeof(first));
        memset(inq,0,sizeof(inq));
    }
    void AddEdge(int u,int v,int w) {
        edges[++m]=(Edge){u,v,w};next[m]=first[u];first[u]=m;
    }
    void solve(int S) {
        queue<int> Q;Q.push(S);
        for(int i=1;i<=n;i++) d[i]=1000000000;d[S]=0;
        while(!Q.empty()) {
            int u=Q.front();Q.pop();inq[u]=0;
            for(int i=first[u];i;i=next[i]) {
                Edge& e=edges[i];
                if(d[e.to]>d[u]+e.dist) {
                    d[e.to]=min(d[e.to],d[u]+e.dist);
                    if(!inq[e.to]) inq[e.to]=1,Q.push(e.to);
                }
            }
        }
    }
}sol;
int main() {
    int n=read(),m=read();sol.init(n);
    for(int i=1;i<=m;i++) {
        int u=read(),v=read(),w=read();
        sol.AddEdge(u,v,w);
    }
    sol.solve(1);
    for(int i=1;i<=n;i++) printf("%d ",sol.d[i]);
    return 0;
}
/*
7 8
1 3 5
1 4 2
1 5 1
4 3 2
3 6 2
4 6 3
6 7 3
5 7 1
*/

时间: 2024-10-17 03:39:07

Dijkstra堆优化与SPFA模板的相关文章

POJ 3013 Big Christmas Tree【最短路变形,DIjkstra堆优化+spfa算法】

Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23064   Accepted: 4987 Description Christmas is coming to KCM city. Suby the loyal civilian in KCM city is preparing a big neat Christmas tree. The simple structure of t

hdu 2544 单源最短路问题 dijkstra+堆优化模板

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41168    Accepted Submission(s): 17992 Problem Description 在每年的校赛里.全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的.所以如今他们想要寻

【日常学习】【Dijkstra堆优化】codevs2038 香甜的黄油题解

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake 先放上题目,出自USACO 题目描述 Description 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油.当然,他将付出额外的费用在奶牛上. 农夫John很狡猾.他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场.他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶. 农

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

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

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

2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] Description Input Output Sample Input 2 1 1 2 1 1 2 2 Sample Output 5 HINT N<=20000,M<=100000 Source dijkstra+堆优化+分层图 把所有的横向和纵向分开看.跑最短路即可. 注意:N这么大,不能写

Heap+Dijkstra堆优化的Dijkstra

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

Poj 1151 Invitation Cards dijkstra 堆优化

很裸的最短路,不过节点数和边数都是1e6,直接dij肯定是不行了,稀疏图用heap优化一下就好 o(╯□╰)o注意STL里面的优先队列是优先级大的(值大的)在前面的,一开始没注意WA了好几发,哎,太粗心了 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #inc

[转]浅谈dijkstra堆优化

众所周知的,dijkstra是图论算法中求单源最短路的一种简单求法.可能有人会说SPFA比dijkstra要实用,而且可以用于求存在负边权的情况,但是dijkstra有着他的优点——其运行速度上优于SPFA. (PS.需要堆进行优化.) 我们先看一道经典(水)题: 平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间.其中的一些点之间有连线. 若有连线,则表示可从一个点到达另一个点,即两点之间有通路,通路的距离为两点之间的直线距离.现在的任务是找出从入点到出点之间的最短路

[Usaco2010 Feb]Chocolate Giving 最短路dijkstra+堆优化

本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 题目:传送门 最短路板子题:迪杰斯特拉+堆优化 注意:因为我建的是大根堆,所以要将距离取负,再存入大根堆堆中,这样队首就是最小值 直接套模板即可 code: 1 #include<bits/stdc++.h> 2 #define inf 0x3f3f3f3f 3 #pragma GCC optimize(3) 4 const int N=50005; 5 const int M=200002; 6 using namespace st