`

单源最短路径---贪心法实现(Dijkstra算法)

阅读更多
//贪心法解决单源最短路经问题
//定点v表示源,a为图的邻接矩阵,dist[i]表示源到顶点i的最短路经长度
//prev[i]表示最短路经中i顶点的前驱顶点

#define MAX_DISTANCE 100000


void Shortest_Path(int v,float **a,float dist[],int prev[],int n){
  if(v < 1 || v > n) return;
  bool *s = ( bool* )malloc( n * sizeof(bool) );//记录是否为s集合中的
//元素
  for(int i = 0; i < n; i++)//初始化
  {
   dist[i] = a[v][i];
   s[i] = false;
   if(dist[i] < MAX_DISTANCE)
    prev[i] = v;
   else
    prev[i] = 0;
  }
  dist[v] = 0;
  s[v] = true;

  for(int i = 0; i < n; i++)  {
    float temp = MAX_DISTANCE;
    int u = v;
    for(int j = 0; j < n; j++)//选择s集合外元素中到源v最小的顶点,并记录
     //该点和最小值
   {
    if(!s[j] && dist[j] < temp)
    {
             u = j;
             temp = dist[j]; 
    }
   }
      
   s[u] = true;//将u加入s集合

   for(int j = 0; j < n; j++) //更新dist的值,使dist[i]为当前的最优解
   {
    if(!s[j] && a[u][j] < MAX_DISTANCE)
    {
     float newdist = dist[u] + a[u][j];
     if(newdist < dist[j])
     {
      dist[j] = newdist;
      prev[j] = u;
     }
    }
   }
  }
}

分享到:
评论
1 楼 fuliang 2007-04-10  
你觉得不是贪心法么?前半段选择s集合外元素中到源v最小的顶点(一步的最优解), 然后把这个点加入s集合中。
贪心法的特点是什么?有最优解结构,它与动态规划的区别在于:他一次就能排除掉所有的次优解,从而确定一步的最优解。

相关推荐

    基于贪心法求解单源最短路径问题.docx

    本资源是关于基于贪心法求解单源最短路径问题的实验报告,包括实验内容、算法设计、算法描述、算法正确性证明、算法分析、算法实现与测试等部分。 实验目的:理解贪心法的核心思想、贪心法的求解过程,并从算法分析...

    实现求解单源点最短路径问题

    这个C程序展示了如何利用Dijkstra算法求解单源点最短路径问题,但需要注意的是,该算法并不适用于存在负权重边的图,因为贪心策略在这种情况下可能无法得到全局最优解。对于存在负权重的图,可以考虑使用其他算法,...

    求单源最短路径的C++语言程序

    ### 单源最短路径算法实现 #### 一、引言 在计算机科学与图论领域,单源最短路径问题是指在一个加权图中找到从一个特定顶点(源点)到所有其他顶点的最短路径的问题。这类问题在实际应用中非常常见,例如在地图导航...

    最短路径-Dijkstra-欧洲旅行(详细分析+代码注释)

    Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出的,用于求解带权重的有向图中的单源最短路径问题。它的核心思想是使用贪心策略,每次选取当前未访问节点中距离起点最近的一个进行扩展,并更新其邻居...

    单源最短路径求解

    单源最短路径问题在图论中是一个经典且重要的问题,它寻找的是从一个特定的起点到图中所有其他顶点的最短路径。在这个场景中,我们关注的算法是Dijkstra(迪杰斯特拉)算法,这是一种解决这类问题的有效方法。...

    单源最短路径.docx

    Dijkstra算法是一种基于贪心策略的解决单源最短路径问题的方法。它按照节点与源点之间路径长度的非递增顺序逐步生成最短路径。具体步骤如下: 1. **初始化阶段**:将源点加入集合S,其余节点放入集合V-S,对所有...

    图.rar 单源最短路径,关键路径,每对结点间的最短路径,图的邻结矩阵,最小生成树

    Dijkstra算法是最常用的解决方法,它保证找到的路径是最短的,并且是贪心算法的一种。另外,Floyd-Warshall算法可以找出图中所有对节点的最短路径,适用于所有边都是非负权重的情况。 2. **关键路径**:在项目管理...

    贪新算法和分支限界法解单源最短路径.doc

    Dijkstra算法是一种基于贪心选择的算法,用于解决单源最短路径问题。该算法的基本思想是,从源点开始,逐步选择最短路径,并将其加入到集合S中。 三、算法设计 对于分支限界法,算法设计可以通过使用MinHeap来实现...

    求两个点之间最短路径

    Dijkstra算法适用于单源最短路径问题,而Floyd-Warshall则可以找出所有节点对之间的最短路径。 1. Dijkstra算法:这是一种贪心算法,通过不断扩展当前最短路径来逐步逼近全局最短路径。它维护一个优先队列(通常...

    公交车最短路径问题 数据结构 C++

    Dijkstra算法适用于单源最短路径问题,即从一个特定的起点到图中所有其他节点的最短路径。Floyd-Warshall算法则可以解决所有对之间最短路径的问题,但在这个案例中,我们只需要从一个起点到一个终点,所以Dijkstra更...

    c写的贪心算法,利用指针来搜索最短路径,以及可以扩展成一般最短路径的求法.zip

    这种方法在某些特定类型的图(如有向无环图DAG)中,如最小生成树问题(Kruskal's或Prim's算法),或者单源最短路径问题(Dijkstra算法)中表现良好。 C#虽然不是用于编写此算法的首选语言,但其强大的通用性和丰富...

    12-贪心法 [兼容模式](1).pdf

    本文将从贪心算法的角度探讨最小生成树和单源最短路径问题的解决方案,具体来说,我们将讨论 Prim 算法和 Kruskal 算法在最小生成树问题中的应用,以及 Dijkstra 算法在单源最短路径问题中的应用。 1. 最小生成树...

    算法-基础算法- 贪心算法(包含源程序).rar

    在某些问题上,如霍夫曼编码、Prim算法构建最小生成树、Dijkstra算法求单源最短路径等,贪心策略可以得到全局最优解。 贪心算法的基本步骤包括: 1. **定义贪心选择性质**:确定在每一步选择中应考虑的最优属性。...

    daohang.zip_最短路径_校园导航

    Dijkstra算法适用于单源最短路径问题,它通过逐步扩展当前已知最短路径的节点来找到从起点到所有其他节点的最短路径。而Floyd-Warshall算法则用于解决所有对之间的最短路径问题,通过动态规划策略更新所有可能的路径...

    Dijkstra(迪杰斯特拉)算法模板

    Dijkstra算法是一种经典的单源最短路径算法,主要用于计算一个起点到图中其他所有顶点的最短路径。它在多个领域都有广泛应用,例如网络路由、地图导航等。Dijkstra算法的主要特点是采用贪心策略,通过不断扩展与起点...

    算法学习与设计课程 基于C++程序语言的算法分析与设计-第06章 贪心法 共157页.ppt

    在C++编程环境下,贪心法可以有效地应用于多种问题,如背包问题、带时限的作业排序、最佳合并模式、最小代价生成树、单源最短路径以及磁带最优存储等。 6.1 一般方法 贪心法的基本思想是通过逐步决策,每次选择当前...

    suanfa.rar_dijkstra算法_图

    总的来说,Dijkstra算法是图论中的重要工具,它通过不断优化节点之间的路径长度,有效地解决了寻找单源最短路径的问题。在MATLAB环境下,可以利用该算法处理各种实际问题,比如网络路径规划、资源分配等。了解并掌握...

    算法分析与设计试题及答案

    这部分内容涉及具体算法的实现细节,包括八皇后问题的回溯算法、数塔问题的解法、汉诺塔问题的递归程序以及Dijkstra算法求解单源最短路径的过程。每个问题都需要理解其核心逻辑,并根据题目给出的条件填写适当的代码...

    数据结构-图-最小生成树-最短路径

    Dijkstra算法是求解单源最短路径的经典算法,它适用于边权重非负的图,通过贪心策略来实现,能有效地求出从起点到其他各点的最短路径;当图中包含负权边时,就需要使用Bellman-Ford算法或Johnson算法来求解。 在...

Global site tag (gtag.js) - Google Analytics