数据结构图之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;
}


相关文章
|
1天前
|
存储 机器学习/深度学习 算法
|
5天前
|
存储 算法
图的深度优先算法
图的深度优先算法
12 0
|
5天前
|
存储 算法
数据结构开篇(普普通通浅浅聊数据结构)什么是数据结构 、什么是算法、重要性、如何学好数据结构呢
数据结构开篇(普普通通浅浅聊数据结构)什么是数据结构 、什么是算法、重要性、如何学好数据结构呢
|
6天前
|
算法 数据可视化 大数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
34 13
|
15天前
|
存储 机器学习/深度学习 算法
上机实验三 图的最小生成树算法设计 西安石油大学数据结构
上机实验三 图的最小生成树算法设计 西安石油大学数据结构
19 1
|
23天前
|
算法 索引
【算法与数据结构】深入二叉树实现超详解(全源码优化)
【算法与数据结构】深入二叉树实现超详解(全源码优化)
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的视频手部检测算法matlab仿真
基于yolov2深度学习网络的视频手部检测算法matlab仿真
|
1月前
|
算法
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
23 2
|
1月前
|
算法
【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱
40 1