《算法分析》作业2

1. 问题

Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵),

 

对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径

 

 

 

 

 

2. 解析

    Floyd算法:暴力法,dis[i][j]表示i节点到j节点的最短距离,每次遍历1-n个点判断dis[i][k]+dis[k][j]dis[i][j]的大小。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 Dijkstra算法:贪心法,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。

 

 

 

 

 

 

 

 

 

 3.设计

 1 void floyd(){
 2     for(int k=1;k<=n;k++){
 3         for(int i=1;i<=n;i++){
 4             for(int j=1;j<=n;j++){
 5                 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
 6             }
 7         }
 8     }
 9 }
10 
11 void dijkstra(int a){
12     memset(vis,0,sizeof vis);
13     rep(i,1,n){
14         dis[i]=g[a][i];
15     }
16     vis[a]=1;
17     rep(i,1,n-1){
18         int minn=inf,k;
19         rep(j,1,n){
20             if(!vis[j]&&minn>dis[j]){
21                 minn=dis[j];
22                 k=j;
23             }
24         }
25         vis[k]=1;
26         rep(j,1,n){
27             if(g[k][j]+dis[k]<dis[j]){
28                 dis[j]=g[k][j]+dis[k];
29             }
30         }
31     }
32 }

 4.分析

      Floyd时间复杂度:三重循环O(n^3)

      Dijkstra时间复杂度:双层循环内层每次遍历N点中到目标点的最近距离所以复杂度是O(n^2)

 5.源码:https://github.com/xiaojunjun601/sfHomework1/tree/master/%E4%BB%A3%E7%A0%81

     

 

 

 

 


posted @ 2021-03-15 18:11  JamZF  阅读(78)  评论(0编辑  收藏  举报