Dijkstra

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 const int INF=0x3f3f3f;
 5 const int m=200005;
 6 const int n=100005;
 7 
 8 int head[n],cnt;
 9 
10 struct edge{
11     int to,next,w;
12 }e[m*2]; 
13 
14 void add(int u,int v,int w){
15     cnt++;
16     e[cnt].to=v;
17     e[cnt].next=head[u];
18     e[cnt].w=w;
19     head[u]=cnt;
20 }
21 
22 struct node{
23     int u,d;
24     bool operator < (const node &rhs) const{
25         return d>rhs.d;
26     }
27 };
28 
29 int dis[n];
30 
31 void dijkstra(int s){
32     for(int i=1;i<=n;i++)
33     {
34         dis[i]=INF;
35     }
36     dis[s]=0;
37     priority_queue<node> q;
38     q.push((node){s,dis[s]});
39     int v,w;
40     while(!q.empty()){
41         node x=q.top();
42         q.pop();
43         int u=x.u;
44         if(x.d!=dis[u])//vis
45         {
46             continue;
47         }
48         for(int i=head[u];i;i=e[i].next)
49         {
50             w=e[i].w;
51             v=e[i].to;
52             if(dis[u]+w<dis[v])
53             {
54                 dis[v]=dis[u]+w;
55                 q.push((node){v,dis[v]});
56             }
57         }
58     }        
59 }
60 
61 int main(){
62     int u,v,w;
63     int n,m,s;
64     cin>>n>>m>>s;
65     for(int i=1;i<=m;i++)
66     {
67         cin>>u>>v>>w;
68         add(u,v,w);
69     }
70     dijkstra(s);
71     for(int i=1;i<=n;i++)
72     {
73         cout<<dis[i]<<" ";
74     }
75     return 0;
76 }

 

posted @ 2019-10-04 18:05  Silke  阅读(116)  评论(0)    收藏  举报