标签:
用HDU2544整理一下最近学的最短路算法
1.Dijkstra算法
原理:集合S表示已经找到最短路径的点,d[]表示当前各点到源点的距离
初始时,集合里面只有源点,当每个点u进入集合S时,用d[u]+w[u][v]更新距离
再重复这个步骤,选取S外所有点中d[]最小的进入集合
直到所有的点都进入S集合
局限性:图的边权必须为正
复杂度:O(V*V),堆优化((E+V)logV)
(1)用邻接矩阵实现
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std; 12 13 typedef long long LL; 14 const int INF = (1<<30)-1; 15 const int mod=1000000007; 16 const int maxn=10005; 17 int w[maxn][maxn],d[maxn],used[maxn]; 18 int n,m; 19 20 void dijkstra(int s){ 21 memset(used,0,sizeof(used)); 22 for(int i=1;i<=n;i++) d[i]=INF; 23 d[s]=0; 24 25 for(int k=1;k<=n;k++){ 26 int p,m=INF; 27 for(int i=1;i<=n;i++) if(!used[i]&&d[i]<m) m=d[p=i]; 28 used[p]=1; 29 for(int i=1;i<=n;i++) d[i]=min(d[i],d[p]+w[p][i]); 30 } 31 } 32 33 int main(){ 34 int a,b,c; 35 while(scanf("%d %d",&n,&m)!=EOF&&n&&m){ 36 for(int i=1;i<=n;i++){ 37 for(int j=1;j<=n;j++){ 38 if(i==j) w[i][j]=0; 39 else w[i][j]=INF; 40 } 41 } 42 43 for(int i=1;i<=m;i++){ 44 scanf("%d %d %d",&a,&b,&c); 45 w[a][b]=w[b][a]=c; 46 } 47 dijkstra(1); 48 printf("%d\n",d[n]); 49 } 50 return 0; 51 }
(2)用邻接表实现
注意记得每次调用dijkstra()时,first[]置为-1
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std; 12 13 typedef long long LL; 14 const int INF = (1<<30)-1; 15 const int mod=1000000007; 16 const int maxn=10005; 17 int d[maxn],used[maxn],firstt[maxn],nextt[maxn]; 18 int n,m,ecnt; 19 20 struct edge{ 21 int v,cost; 22 } e[maxn]; 23 24 void dijkstra(int s){ 25 memset(used,0,sizeof(used)); 26 for(int i=1;i<=n;i++) d[i]=INF; 27 d[s]=0; 28 29 for(int k=1;k<=n;k++){ 30 int p,m=INF; 31 for(int i=1;i<=n;i++) if(!used[i]&&d[i]<m) m=d[p=i]; 32 used[p]=1; 33 for(int i=firstt[p];i!=-1;i=nextt[i]){ 34 int v=e[i].v; 35 if(d[v]>d[p]+e[i].cost) 36 d[v]=d[p]+e[i].cost; 37 } 38 } 39 } 40 41 void addedges(int u,int v,int w){ 42 nextt[++ecnt]=firstt[u]; 43 e[ecnt].v=v; 44 e[ecnt].cost=w; 45 firstt[u]=ecnt; 46 } 47 48 int main(){ 49 int a,b,c; 50 while(scanf("%d %d",&n,&m)!=EOF&&n&&m){ 51 ecnt=0; 52 memset(firstt,-1,sizeof(firstt)); 53 54 for(int i=1;i<=m;i++){ 55 scanf("%d %d %d",&a,&b,&c); 56 addedges(a,b,c); 57 addedges(b,a,c); 58 } 59 dijkstra(1); 60 printf("%d\n",d[n]); 61 } 62 return 0; 63 }
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4419535.html