zoukankan      html  css  js  c++  java
  • 《算法分析》作业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

         

     

     

     


  • 相关阅读:
    ElasticSearch 深度搜索、滚动搜索,批量操作
    ElasticSearch搜索
    Elasticsearch 建立ik中文分词器和自定义分词
    React-Redux
    高阶组件-HOC
    React Context使用
    将秒数转换为时分秒格式
    『TensorFlow』TF2的模型保存
    『一图流』基于CRNN的OCR张量流概览
    Dapr微服务应用开发系列0:概述
  • 原文地址:https://www.cnblogs.com/zpj61/p/14538352.html
Copyright © 2011-2022 走看看