码迷,mamicode.com
首页 > 编程语言 > 详细

Book 最短路算法

时间:2015-04-12 16:12:36      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

用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 }
View Code

(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 }
View Code

 

Book 最短路算法

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4419535.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!