最短路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)