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


相关文章
|
25天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
62 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
22天前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
31 4
|
28天前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
29天前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
17 0
|
6天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
67 9
|
3天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
5天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
27 4
|
29天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
26 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
9天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
28天前
初步认识栈和队列
初步认识栈和队列
57 10