Dijkstra算法模板

如题。存模板。

洛谷 P4779 [模板]单源最短路径(标准版)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 
 7 int n,m,s;
 8 int hd[100005],to[200005],nx[200005],len[200005],ec;
 9 int dis[100005],v[100005];
10 
11 void edge(int af,int at,int el)
12 {
13     to[++ec]=at;
14     len[ec]=el;
15     nx[ec]=hd[af];
16     hd[af]=ec;
17 }
18 
19 struct data
20 {
21     int p,d;
22     friend bool operator < (data w,data e)
23     {
24         return w.d>e.d;
25     }
26 };
27 
28 priority_queue<data>qq;
29 
30 void dijkstra()
31 {
32     memset(dis,0x3f,sizeof(dis));
33     dis[s]=0;
34     qq.push((data){s,0});
35     while(!qq.empty())
36     {
37         data nw=qq.top();
38         qq.pop();
39         if(v[nw.p])continue;
40         v[nw.p]=1;
41         for(int i=hd[nw.p];i;i=nx[i])
42         {
43             if((!v[to[i]])&&dis[to[i]]>nw.d+len[i])
44             {
45                 dis[to[i]]=nw.d+len[i];
46                 qq.push((data){to[i],dis[to[i]]});
47             }
48         }
49     }
50 }
51 
52 int main()
53 {
54     scanf("%d%d%d",&n,&m,&s);
55     for(int i=1;i<=m;i++)
56     {
57         int u,v,w;
58         scanf("%d%d%d",&u,&v,&w);
59         edge(u,v,w);
60     }
61     dijkstra();
62     for(int i=1;i<=n;i++)printf("%d ",dis[i]);
63     return 0;
64 }
原文地址:https://www.cnblogs.com/eternhope/p/9927268.html