最短路径---dijkstra算法模板
Posted xxrll
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径---dijkstra算法模板相关的知识,希望对你有一定的参考价值。
dijkstra算法模板
http://acm.hdu.edu.cn/showproblem.php?pid=1874
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<stdlib.h> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<string> 10 #include<set> 11 #include<cctype> 12 #include<sstream> 13 #define mem(a) memset(a,0,sizeof(a)) 14 #define LL long long 15 #define inf 0x3f3f3f3f 16 using namespace std; 17 const int N=1e3+5; 18 int mp[N][N],dis[N],mark[N]; 19 int n,m; 20 int dijkstra(int s,int t) 21 { 22 for(int i=0;i<n;i++) 23 dis[i]=(i==s?0:mp[s][i]); 24 mark[s]=1; 25 //dis[s]=0; 26 int v; 27 for(int i=1;i<n;i++) 28 { 29 int mx=inf; 30 for(int j=0;j<n;j++) 31 if(dis[j]<mx&&!mark[j]) 32 mx=dis[v=j]; //%%% 33 if(mx==inf) break; 34 mark[v]=1; 35 for(int j=0;j<n;j++) 36 { 37 if(!mark[j]&&(dis[j]>dis[v]+mp[v][j])) 38 dis[j]=dis[v]+mp[v][j]; 39 } 40 } 41 if(dis[t]>=inf) return -1; 42 return dis[t]; 43 } 44 int main() 45 { 46 while(~scanf("%d%d",&n,&m)&&(n+m)) 47 { 48 for(int i=0;i<n;i++) 49 { 50 for(int j=0;j<n;j++) 51 { 52 if(i==j)mp[i][j]=0; 53 else mp[i][j]=inf; 54 } 55 } 56 mem(mark); 57 int l,r,x; 58 for(int i=1;i<=m;i++) 59 { 60 scanf("%d%d%d",&l,&r,&x); 61 if(mp[l][r]>x) mp[l][r]=mp[r][l]=x; 62 } 63 int s,t; 64 scanf("%d%d",&s,&t); 65 66 printf("%d ",dijkstra(s,t)); 67 } 68 return 0; 69 }
以上是关于最短路径---dijkstra算法模板的主要内容,如果未能解决你的问题,请参考以下文章