[模板]Dijkstra

吃可爱长大的小学妹 提交于 2019-12-04 08:03:38

 前言

  考试前几天才发现一直写的Dijkstra是错的,有点惭愧,现在打了个板子放在这里,以示后人

  题目链接 : https://www.luogu.org/problem/P4779

   Code

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 #include <cstring>
 5 using namespace std;
 6 typedef long long ll;
 7 const int N=100002;
 8 const int M=200002;
 9 const int inf=2147483647;
10 inline int read()
11 {
12     char ch=getchar();
13     int x=0;bool f=false;
14     while (!isdigit(ch)) f^=!(ch^45),ch=getchar();
15     while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
16     if (f) x=-x;return x;
17 }
18 int n,m,s;
19 int head[N],to[M],nex[M],cnt=0;
20 ll val[M];
21 ll dis[N];
22 bool vis[N];
23 struct data
24 {
25     int id;
26     ll v;
27     bool operator <(const data&A)const
28     {
29         return A.v<v;
30     }
31 };
32 inline void add(int s,int ed,ll w)
33 {
34     to[++cnt]=ed;
35     val[cnt]=w;
36     nex[cnt]=head[s];
37     head[s]=cnt;
38 }
39 inline void Dijkstra(int st)
40 {
41     priority_queue<data>q;
42     for (int i=1;i<=n;++i)
43     dis[i]=inf;
44     dis[st]=0;
45     q.push((data){st,dis[st]});
46     while (!q.empty())
47     {
48         int now=q.top().id;
49         q.pop();
50         if (vis[now]) continue;
51         vis[now]=true;
52         for (int i=head[now];i;i=nex[i])
53         {
54             int v=to[i];
55             if (!vis[v]&&dis[v]>dis[now]+val[i])
56             {
57                 dis[v]=dis[now]+val[i];
58                 q.push((data){v,dis[v]});
59             }
60         }
61     }
62 }
63 int main()
64 {
65     n=read(),m=read(),s=read();
66     int x,y,z;
67     for (int i=1;i<=m;++i)
68     {
69         x=read(),y=read(),z=read();
70         add(x,y,z);
71     }
72     Dijkstra(s);
73     for (int i=1;i<=n;++i)
74     printf("%lld ",dis[i]);
75     return 0;
76 }

 

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!