数据结构图之Dijkstra(迪杰斯特拉)算法

简介: 数据结构图之Dijkstra(迪杰斯特拉)算法

写了一个下午的Dijkstra(迪杰斯特拉)算法 (其实写了1个小时 其余时间一直在改错还是最后结果不匹配    找了一个下午终于找到了   是输入邻接矩阵时 在没有路线时原本是输入-1 结果不对  经过调整  输入32767  结果正确)希望在我身上发生的能让个位看官避雷而且希望我的代码可以对更多人有帮助。

跟着小v不迷路,希望给小v一个三连。上代码。

# include <stdio.h>
 # define max 100
typedef struct {
  int v[max];              //定点表 
  int arc[max][max];       //邻接矩阵 
  int vnum , bnum;     //定点数     边数 
} tu;  
 tu creat (tu t)
 {
  printf("请输入定点数和边数"); 
   //输入顶点数    边数 
  scanf("%d",&(t.vnum));
   // printf("进行到这了"); 
  scanf("%d",&(t.bnum));   
  for(int i=0;i<t.vnum;i++)   //初始化  顶点表 
   {
      printf("请输入顶点"); 
    scanf("%d",&t.v[i]); 
     }
        printf("请输入边的权值"); 
     for(int i=0;i<t.vnum;i++)
   {
      for(int j=0;j<t.vnum;j++)
       {
      scanf("%d",&t.arc[i][j]); 
       }  
    }
     for(int i=0;i<t.vnum;i++)
     {
         for(int j=0;j<t.vnum;j++)
         {
             printf("%d ",t.arc[i][j]);
         }
         printf("\n");
     }  
    return t;
     } 
int findmin(int *dist,int *s,int n)
{
  int j,k=0;
  int min=32767;
  for(j=0;j<n;j++)
  {
    if((s[j]==0)&&(dist[j]<min))
    {
      min=dist[j];
      k=j;
    }
  }
//  if(k==0)
//  return -1;
//  else
  return k; 
}
   /*
存储结构   带权的邻接矩阵     因为要随时读取数据   所以用邻接矩阵 
    按路径长度递增的次序产生最短路径的算法 
    dist[]数组      存储权值       没有就赋值为-1  不考虑s数组中的顶点 
    path[]数组      表示找到了从初始点到vi的最短路径   存双亲节点 
    若有弧长  则为0       否则为-1 
    s[]数组   存放源点和已经生成的终点  初始状态只有起点 
*/
   void Djstl(tu t)
     {
      int i,min,num;
      int dist[t.vnum];       
      int path[t.vnum];
      int s[t.vnum];
      //初始化 
      //先以第一行的权值进行赋值
      for(i=0;i<t.vnum;i++)
     {
      s[i]=0;                 //初始化均为0  表示未进入路径   进入路径为1 
      dist[i]=t.arc[0][i];      //表示 0   到各个顶点的距离      未相连接为-1 
      if(dist[i]!=32767)            //表示为 某个点到到改点有路径  可以到达 
      {
        path[i]=0 ;             //       初始化    所有点的父顶点都为0号源点 
       }
       else
       path[i]=-1;
      } 
      s[0]=1 ;            //表示已经进入路径 
      num=1; 
      while(num<t.vnum)
      {
        min=findmin(dist,s,t.vnum);
        s[min]=1;
        for(i=0;i<t.vnum;i++)
        { 
            if((s[i]==0)&&(dist[i]>dist[min]+t.arc[min][i]) )
      {
        dist[i]=dist[min] + t.arc[min][i];
        path[i]=min;        
       //  printf("%d",num);       if  只进行了3次    
      }
        }
        num++;
//      printf("%d\n",num); 
      }
      printf("输出的是dist数组:");
      for(i=0;i<t.vnum;i++)
      {
        printf("%d ",dist[i]);  
      }
      printf("\n");
       printf("输出的是path数组:");
       for(i=0;i<t.vnum;i++)
      {
        printf("%d ",path[i]);  
      }
       printf("\n");
        printf("输出的是数组:");
       for(i=0;i<t.vnum;i++)
      {
        printf("%d ",s[i]); 
      }
   }
int main()
{
  tu t;
  t=creat(t);
  Djstl(t);
  return 0;
}


相关文章
|
4月前
|
存储 运维 监控
基于 C# 语言的 Dijkstra 算法在局域网内监控软件件中的优化与实现研究
本文针对局域网监控系统中传统Dijkstra算法的性能瓶颈,提出了一种基于优先队列和邻接表优化的改进方案。通过重构数据结构与计算流程,将时间复杂度从O(V²)降至O((V+E)logV),显著提升大规模网络环境下的计算效率与资源利用率。实验表明,优化后算法在包含1000节点、5000链路的网络中,计算时间缩短37.2%,内存占用减少21.5%。该算法适用于网络拓扑发现、异常流量检测、故障定位及负载均衡优化等场景,为智能化局域网监控提供了有效支持。
96 5
|
20天前
|
机器学习/深度学习 编解码 算法
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
120 4
|
2月前
|
算法 机器人 定位技术
基于机器视觉和Dijkstra算法的平面建筑群地图路线规划matlab仿真
本程序基于机器视觉与Dijkstra算法,实现平面建筑群地图的路径规划。通过MATLAB 2022A读取地图图像,识别障碍物并进行路径搜索,支持鼠标选择起点与终点,最终显示最优路径及长度,适用于智能导航与机器人路径规划场景。
|
7月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
182 15
|
8月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
6月前
|
运维 监控 算法
基于 Python 迪杰斯特拉算法的局域网计算机监控技术探究
信息技术高速演进的当下,局域网计算机监控对于保障企业网络安全、优化资源配置以及提升整体运行效能具有关键意义。通过实时监测网络状态、追踪计算机活动,企业得以及时察觉潜在风险并采取相应举措。在这一复杂的监控体系背后,数据结构与算法发挥着不可或缺的作用。本文将聚焦于迪杰斯特拉(Dijkstra)算法,深入探究其在局域网计算机监控中的应用,并借助 Python 代码示例予以详细阐释。
136 6
|
11月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
229 59
|
4月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
61 0
栈区的非法访问导致的死循环(x64)
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
|
9月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
338 77

热门文章

最新文章