[模板]Dijkstra-优先队列优化-单元最短路

人走茶凉 提交于 2019-12-04 01:06:19

输入:

6 9 1
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4

输出:

0 1 8 4 13 17

Code:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<queue>
 4 using namespace std;
 5 #define PII pair<int,int>
 6 const int maxn=10000,maxm=1000;
 7 int cnt=0,edge[maxm],ver[maxm],nxt[maxm],head[maxn];
 8 int d[maxn];
 9 bool v[maxn];//v[i]表示i点是否松弛 
10 priority_queue < PII,vector<PII>,greater<PII> > q;//优先队列,以p.first最小优先
11 inline void add(int x,int y,int z)
12 {
13     cnt++;
14     ver[cnt]=y;
15     edge[cnt]=z;
16     nxt[cnt]=head[x];
17     head[x]=cnt;
18 }
19 inline void dijk(int t)
20 {
21     int i;
22     memset(d,0x3f,sizeof(d));
23     memset(v,0,sizeof(v));
24     d[t]=0;
25     for(i=head[t];i;i=nxt[i])
26         d[ver[i]]=edge[i];//d[i]为t->i当前的最小值 
27     
28     q.push(make_pair(0,t));
29     while(!q.empty())
30     {
31         int mind=q.top().second;//mind为距离t距离最小的点
32         q.pop();
33         if(v[mind]==1)//已松弛过 
34             continue;
35         for(i=head[mind];i;i=nxt[i])
36         {
37             if(d[mind]+edge[i]<d[ver[i]])//(t->mind)-->ver[i]距离取更小d[ver[i]]
38                 d[ver[i]]=d[mind]+edge[i];
39             q.push( make_pair(d[ver[i]],ver[i]) );
40         }
41         v[mind]=1;
42     }
43 }
44 int main()
45 {
46     int n,m,i,t;
47     cin>>n>>m>>t;
48     for(i=0;i<m;i++)
49     {
50         int a,b,c;
51         cin>>a>>b>>c;
52         add(a,b,c);
53     }
54     dijk(t);
55     for(i=1;i<n;i++)
56         cout<<d[i]<<" ";
57     cout<<d[n];//格式 
58     return 0;
59 }

 

 

------------恢复内容结束------------

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