最短路板子

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 static const int INFTY=2147483647;
 4 const int maxm=500010;
 5 using namespace std;
 6 struct edge{
 7     int t,w,next;
 8 }e[maxm*2];
 9 ll first[maxm*2],dis[maxm*2],ent;
10 bool vis[maxm*2];
11 int n,m,s;
12 void add(int u,int v,int w)
13 {
14     e[++ent].t=v;e[ent].w=w;e[ent].next=first[u];first[u]=ent;
15 }
16 struct node{
17     int dis,pos;
18     bool operator<(const node &x)const
19     {
20         return x.dis<dis;
21     }
22 };
23 std::priority_queue<node> q;
24 void dij()
25 {
26     dis[s]=0;q.push((node){0,s});
27     while(!q.empty())
28     {
29         node tem=q.top();q.pop();
30         int x=tem.pos;
31         if(vis[x])continue;
32         vis[x]=1;
33         for(int i=first[x];i;i=e[i].next)
34         {
35             int t=e[i].t;
36             if(dis[t]>dis[x]+e[i].w)
37             {
38                 dis[t]=dis[x]+e[i].w;
39                 if(!vis[t])
40                 q.push((node){dis[t],t});
41             }
42         }
43     }
44 }
45 int main()
46 {
47     scanf( "%d%d%d", &n, &m, &s );
48     for(int i = 1; i <= n; ++i)
49     dis[i] = INFTY;
50     for(int i = 0; i < m; ++i )
51     {
52         int u, v, d;
53         scanf( "%d%d%d", &u, &v, &d );
54         add( u, v, d );
55     }
56     dij();
57     for( int i = 1; i <= n; i++ )
58         printf( "%d ", dis[i] );
59     return 0;
60 }
 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 struct data{
 5     int from;
 6     int to;
 7     int w;
 8     int next;
 9 }a[500001];
10 queue<int> q;
11 bool vis[10001];
12 int first[10001];
13 ll d[10001];
14 int m,n,s,ent;
15 inline int read()
16 {
17     char ch;
18     int f=1,num=0;
19     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
20     while(ch>='0'&&ch<='9'){num=num*10+ch-'0';ch=getchar();}
21     return f*num;
22 }
23 inline void add(int u,int v,int ww)
24 {
25     ent++;
26     a[ent].from=u;
27     a[ent].to=v;
28     a[ent].w=ww;
29     a[ent].next=first[u];
30     first[u]=ent;
31 }
32 void spfa()
33 {
34     q.push(s);
35     d[s]=0;
36     vis[s]=1;
37     while(!q.empty())
38     {
39         int h=q.front() ;
40         q.pop() ;
41         vis[h]=0;
42         for(int i=first[h];i;i=a[i].next )
43         {
44             int tt=a[i].to;
45             if(d[h]+a[i].w<d[tt])
46             {
47                 d[tt]=d[h]+a[i].w;
48                 if(!vis[tt])
49                 {
50                     q.push(tt);
51                     vis[tt]=true;
52                 }
53             }
54         }
55     } 
56 }
57 int main()
58 {
59     n=read();m=read();s=read();
60     for(int i=1;i<=m;i++)
61     {
62         int u,v,p;
63         u=read();v=read();p=read();
64         add(u,v,p);
65     }
66     for(int i=1;i<=n;i++)
67     d[i]=2147483647;
68     spfa();
69     for(int i=1;i<=n;i++)
70     printf("%lld ",d[i]);
71     return 0;
72 }
原文地址:https://www.cnblogs.com/mjc191812/p/12252054.html