迪杰特斯拉夫最短路径算法

#include<stdio.h>
#include<windows.h>

int a[10][10];
int arc[10];//记录弧的端点
int cost[10];//记录从起始点到当前i点的距离
int use[10];//记录当前i点是否被使用

void path(int n){

   for(int i=0;i<n;i++){//初始赋值默认所有点从点0开始,该点的路径前缀点为0,use[i]未被使用
      cost[i]=a[0][i];
      arc[i]=0;
      use[i]=0;
   }
   use[0]=1;//默认0为起点,将0加入最短路径
   for(int i=1;i<n;i++){//默认最后的路径必为连通图
      int j=1;          //记录当前循环下标
      int k=0;          //记录目前已知的未知点路径最短的点下标
      int min=65535;    //比较值默认65535为不可达
      while(j<n){
          if(use[j]==0&&cost[j]>0&&cost[j]<min){//判断条件:当前点未用且路径比目前最短的路径端
              k=j;
              min=cost[i];
          }
          j++;
      }
      use[k]=1;//标记该点到起点的路径已知
      printf("%d,%d\n",k,cost[k]);
      for(int i=0;i<n;i++){
           printf("%d ",cost[i]);
      }
      printf("\n");
      system("pause");
      for(int t=0;t<n;t++){
          //更新由已知新的算出来最短路径的点到剩余的点的路径的长度,条件:可达且未被用,更新后的值比当前的值小
          if(a[k][t]>0&&a[k][t]<65535&&use[t]==0&&a[k][t]+cost[k]<cost[t]){
            cost[t]=a[k][t]+cost[k];
            arc[t]=k;
          }
      }
   }
   for(int i=0;i<n;i++){
       printf("%d ",arc[i]);
   }
}
int main(){
   int n;
   scanf("%d",&n);
   for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
         scanf("%d",&a[i][j]);
      }
   }
   path(n);

}
时间: 2024-11-06 15:02:45

迪杰特斯拉夫最短路径算法的相关文章

看数据结构写代码(47)迪杰斯特拉最短路径算法

这个算法的 思想 根 求 最小生成树算法 普里姆(Prim)算法 极其相似.迪杰斯算法 是求 一个顶点 到其他 顶点的 最短路径算法. 下面 上代码:(用的是 邻接矩阵 表示法) //迪杰斯特拉 最短路径. //从 vex顶点 到其他 顶点的 最短路径 void shortestPath_Dij(MGraph g,char vex){ int loc = graphLocation(g,vex); int minArray[MAX_VERTEX_NUM]={0};//最小路径值 bool fin

图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪杰斯特拉算法 求从源点到其余各点的最短路径 依最短路径的长度递增的次序求得各条路径 路径长度最短的最短路径的特点: 在这条路径上,必定只含一条弧,并且这条弧的权值最小. 下一条路径长度次短的最短路径的特点: 它只可能有两种情况:或是直接从源点到该点(只含一条弧):或者是从源点经过顶点v1,再到达该顶

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法 本篇名言:"辛勤的蜜蜂永没有时间悲哀.--布莱克" 这次来看下Dijkstra )算法.还是老方法,先原理,后实现.代码来自网络. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47046031 1.  最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径. 管道铺设.线路安排

HDU 3790 最短路径问题(Dijkstra 迪杰斯特法最短路径算法)

Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p.最后一行是两个数 s,t;起点s,终点.n和m为0时输入结束.(1<n<=1000, 0<m<100000, s != t) Output 输出 一行有两个数, 最短

最短路径算法

最短路径-Dijkstra算法和Floyd算法 1.Dijkstra算法 1.1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点

有向有权图的最短路径算法--Dijkstra算法

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法, 在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算

最短路径算法的命令式、函数式版本对比分析

C版本(来自 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)) 1 /*************************************** 2 * About: 有向图的Dijkstra算法实现 3 * Author: Tanky Woo 4 * Blog: www.WuTianQi.com 5 ***************************************/ 6 7 #include <iostream> 8 using namespace

[总结]最短路径算法

所谓最短路径问题是指:如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小. 下面我们介绍两种比较常用的求最短路径算法: Dijkstra(迪杰斯特拉)算法 迪杰斯特拉算法思想是按路径长度递增的次序一步一步并入来求取,是贪心算法的一个应用,用来解决单源点到其余顶点的最短路径问题.另外,要注意D算法是无法解决负权重问题的,所以图的权重必须为正. 首先,我们引入一个辅助向量\(D\),它的每个分量\(D[i]\)表示当

最短路径算法总结(floyd,dijkstra,bellman-ford)

继续复习数据结构和算法,总结一下求解最短路径的一些算法. 弗洛伊德(floyd)算法 弗洛伊德算法是最容易理解的最短路径算法,可以求图中任意两点间的最短距离,但时间复杂度高达\(O(n^3)\),主要思想就是如果想缩短从一个点到另一个点的距离,就必须借助一个中间点进行中转,比如A点到B点借助C点中转的话AB的距离就可以更新为\(D(a,b)=Min(D(a,b),D(a,c)+D(c,b))\),这样我们用每一个结点作为中转结点,尝试对另每两个结点进行距离更新,总共需要三层循环进行遍历. 核心代