最短路Dijkstra模板

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路Dijkstra模板相关的知识,希望对你有一定的参考价值。

传送门:单源最短路

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 const int MAXN = 10000+1;
 7 const int MAXM = 500000+1;
 8 const int INT_MAX = 2147483647;
 9 
10 struct EDGE{
11     int next,to,dis;
12 }Edge[MAXM];
13 int Head[MAXN],n,m,s,Size,dis[MAXN];
14 bool Vis[MAXN];
15 
16 void Ins(int From,int To,int Dis)
17 {
18     Edge[++Size].next=Head[From];
19     Edge[Size].to=To;
20     Edge[Size].dis=Dis;
21     Head[From]=Size;
22 }
23 
24 void Dijkstra()
25 {
26     for(int i=1;i<=n;i++) dis[i]=INT_MAX;
27     dis[s]=0;
28     for(int i=1;i<=n;i++)
29     {
30         int Pos=0,MAX=INT_MAX;
31         for(int j=1;j<=n;j++)
32             if(!Vis[j]&&dis[j]<MAX)
33                 MAX=dis[Pos=j];
34         Vis[Pos]=1;
35         for(int u=Head[Pos];u;u=Edge[u].next)
36         {
37             int v=Edge[u].to,Dis=Edge[u].dis;
38             if(!Vis[v])
39                 dis[v]=min(dis[v],MAX+Dis);
40         }
41     }
42 }
43 
44 int main()
45 {
46     scanf("%d%d%d",&n,&m,&s);
47     for(int i=1,u,v,Dis;i<=m;i++)
48     {
49         scanf("%d%d%d",&u,&v,&Dis);
50         Ins(u,v,Dis);
51     }
52     Dijkstra();
53     for(int i=1;i<=n;i++)
54         printf("%d ",dis[i]);
55     return 0;
56 }

 

+堆优化

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #include<climits>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 const int MAXN = 500000;
 9 #define Pair pair<int,int>
10 
11 struct EDGE{
12     int Next,To,Dis;
13 }Edge[MAXN<<1];
14 
15 int n,m,s,t,Read,u,v,Head[MAXN<<1];
16 int Dis[MAXN];
17 bool Vis[MAXN];
18 
19 void Ins(int Number,int From,int To,int Dis){
20     Edge[Number].Next=Head[From];
21     Edge[Number].To=To;
22     Edge[Number].Dis=Dis;
23     Head[From]=Number;
24 }
25 
26 void Dijkstra_Heap(){
27     for(int i=1;i<=n;i++) Dis[i]=INT_MAX;
28     Dis[s]=0;
29     priority_queue<Pair,vector<Pair>,greater<Pair> > Que;
30     Que.push(make_pair(Dis[s],s));
31     while(!Que.empty()){
32         u=Que.top().second;Que.pop();
33         if(Vis[u]) continue;
34         Vis[u]=1;
35         for(int i=Head[u];i;i=Edge[i].Next){
36             v=Edge[i].To;
37             if(Dis[u]+Edge[i].Dis<Dis[v]){
38                 Dis[v]=Dis[u]+Edge[i].Dis;
39                 Que.push(make_pair(Dis[v],v));
40             }
41         }
42     }
43 }
44 
45 int main(){
46     scanf("%d%d%d",&n,&m,&s);
47     for(int i=1;i<=m;i++){
48         scanf("%d%d%d",&u,&v,&Read);
49         Ins(i,u,v,Read);//Ins(i+n,v,u,Read);
50     }
51     Dijkstra_Heap();
52     for(int i=1;i<=n;i++)
53         printf("%d ",Dis[i]);
54     return 0;
55 }

 

Spfa:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 
 7 const int MAXN = 10000+1;
 8 const int MAXM = 500000+1;
 9 const int INT_MAX = 2147483647;
10 
11 struct EDGE{
12     int next,to,dis;
13 }Edge[MAXM];
14 int Head[MAXN],n,m,s,Size,dis[MAXN];
15 bool Vis[MAXN];
16 queue <int> Que;
17 
18 void Ins(int From,int To,int Dis)
19 {
20     Edge[++Size].next=Head[From];
21     Edge[Size].to=To;
22     Edge[Size].dis=Dis;
23     Head[From]=Size;
24 }
25 
26 void SPFA()
27 {
28     for(int i=1;i<=n;i++) dis[i]=INT_MAX;
29     dis[s]=0;Vis[s]=1;Que.push(s);
30     while(!Que.empty())
31     {
32         int u=Que.front();
33         Que.pop();
34         Vis[u]=0;
35         for(int i=Head[u];i;i=Edge[i].next)
36         {
37             int v=Edge[i].to,Dis=Edge[i].dis;
38             if(Dis+dis[u]<dis[v])
39             {
40                 dis[v]=Dis+dis[u];
41                 if(!Vis[v])
42                 {
43                     Vis[v]=true;
44                     Que.push(v);
45                 }
46             }
47         }
48     }
49 }
50 
51 int main()
52 {
53     scanf("%d%d%d",&n,&m,&s);
54     for(int i=1,u,v,Dis;i<=m;i++)
55     {
56         scanf("%d%d%d",&u,&v,&Dis);
57         Ins(u,v,Dis);
58     }
59     SPFA();
60     for(int i=1;i<=n;i++)
61         printf("%d ",dis[i]);
62     return 0;
63 }

 

以上是关于最短路Dijkstra模板的主要内容,如果未能解决你的问题,请参考以下文章

hdoj2544 最短路(Dijkstra || Floyd || SPFA)

训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

最短路Dijkstra模板

LQ0151 最短路Dijkstra算法

[模板]单源最短路径(Dijkstra)

HDU 2544 - 最短路 - [堆优化dijkstra][最短路模板题]