[模版]单源最短路 dijkstra&SPFA(小根堆+pair优化)

WOW
在网上找了好多模板,但没发现有用 小根堆+pair 写dijkstra的模板 ,于是特别优化了一下,顺便还加了SPFA的代码。。。。
 1 #include <iostream>  //[模版]单源最短路 dijkstra&SPFA(小根堆+pair优化)
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <queue>
 5 #include <cstring>
 6 #include <vector>
 7 const int maxn=1000010;
 8 typedef std::pair <long long ,int > p;
 9 std::priority_queue < p , std::vector <p> , std::greater <p> > q;
10 using namespace std;
11 long long  k=0,head[maxn],dis[maxn]={2147483647};
12 bool vis[maxn];
13 int n,m,s;
14 
15 struct edge 
16 {int next,to,val;}e[maxn*2];
17 
18 inline void add(int from,int to,int val)
19 {
20     e[++k].to=to;
21     e[k].val=val;
22     e[k].next=head[from];
23     head[from]=k;
24 }
25 
26 inline void dijkstra(int s)
27 {
28     q.push( make_pair (0,s) ) , dis[s]=0;
29     while(!q.empty())
30     {
31         int from = q.top().second;
32         long long distance=q.top().first;   
33         q.pop();
34         vis[from] = true;
35         if(distance>dis[from])continue;
36         for(int i=head[from];i;i=e[i].next)
37         {
38             int to = e[i].to;
39             if(!vis[to] && dis[to] > dis[from] + e[i].val)
40             {
41                 dis[to] = dis[from]+e[i].val;
42                 q.push( make_pair (dis[to],to) );
43             }
44         }       
45     }
46 }
47 
48 inline void spfa(int s)//披着Dijkstra外衣的SPFA
49 {
50     dis[s]=0 , q.push(make_pair(dis[s],s));
51     while(!q.empty()){
52     int now=q.top().second;
53     q.pop();
54     if(vis[now])continue;
55     vis[now]=1;
56        for(int i=head[now];i;i=e[i].next)
57        {
58             int to=e[i].to;
59             if(!vis[to]&&dis[now]+e[i].val<dis[to])
60             {
61             dis[to]=dis[now]+e[i].val;
62             q.push(make_pair(dis[to],to));
63             }
64         }
65     }
66 }
67 
68 
69 int main ()
70 {
71     cin>>n>>m>>s;
72     for (int i=1;i<=m;i++)
73     {
74         int u,v,w;
75         scanf ("%d%d%d",&u,&v,&w);
76         add(u,v,w);
77     }
78     memset(dis,0x3f,sizeof(dis));
79     memset(vis,0,sizeof(vis)); 
80     spfa(s);
81     //dijkstra(s);
82     for (int i=1;i<=n;i++)
83     {
84         printf ("%lld ",dis[i]);
85     }
86     return 0;
87 }

 

来自:2113王子烨
posted @ 2019-10-22 21:26  包头九中oi博客  阅读(256)  评论(1)    收藏  举报