【作业存档】Dijkstra算法的练习

本文记录了一次使用Dijkstra算法解决寻找有向图中每个点到源点的最短路径作业的过程。作者分享了在编程过程中遇到的问题,如未充分理解算法、错误地使用Queue实现等,并强调了写代码前需深入理解算法、学习数据结构的重要性。最终,作者提供了正确实现Dijkstra算法的代码,并指出在数据量小时,可使用数组代替最小堆简化实现。
摘要由CSDN通过智能技术生成

作为一个无脑莽撞的少年,完成这次(超简单的)作业历经波折。

目标是用函数实现,找到图中每个点到源所有的加权最短路径,记录下总长度(边的权值和)和条数。如果不相连,总长度为-1和条数0

dist记录总长度,count记录找到了几条这样的路径。

用Dijkstra算法可以直接实现非常简单,但是我太心急和浮躁,没有彻底弄清楚D算法就直接上手,导致绕了远路。


不过,也学到了很重要的东西:

1.写代码前一定要搞清楚算法,

2.学习数据结构不能听听课就好,课下要花功夫钻研。

3.发现自己的算法改起来很困难的时候,直接推翻换一个思路。

4.写同一个代码超过两个小时就去做点别的事情,回来可以直接推翻重写。


【知识点复习】:用矩阵表示有向图,行代表出发的结点,列代表进入的节点

【错误总结】:

如果要用Queue来实现Dijkstra算法,需要用最小堆才可以(((非常麻烦所以在数据量很小的时候就用数组储存吧

用两次D算法(参考网上代码,后来发现可以合并成一次)和用一次D算法中有很多细节错误(if语句括号没括全),但最重要的问题是,缺少Graph->G[V][W]!= INFINITY

然而题目并没有说过这种事情((


下面放上最后的代码

void ShortestDist(MGraph Graph, int dist[], int count[], Vertex S){
    bool isVisit[MaxVertexNum];
    int i, minDis,V, W, tmpDis;
    
    for (i = 0; i < Graph->Nv; i++){
        dist[i] = -1;
        
        count[i] = 0;
        isVisit[i] = false;
    }
    dist[S] = 0;
    count[S] = 1;
    
    while (1){
        minDis = INFINITY;
        
        for (i = 0; i < Graph->Nv; i++){
            if (!isVisit[i] && dist[i] < minDis && dist[i] !&
数据结构习题Dijkstra 1.3、将二叉树看作图,并对它作图的深度优先遍历,则与原二叉树的 结果是相同的。 A、前序遍历 B、中序遍历C、后序遍历D、层次序遍历 1.4、在关于树的以下4种叙述中,正确的是 。 A、用指针方式存储有n个结点的二叉树,至少要有n+1个指针。 B、m阶B-树中,具有k个子结点的结点,必有k-1个键值。 C、m阶B-树中,每个非叶子结点的子结点个数≥[m/2]。 D、平衡树一定是丰满树。 1.5、在最好和最坏情况下的时间复杂度均为O(nlog2n)且稳定的排序方法是 A、希尔排序 B、快速排序 C、堆排序 D、归并排序 二、解答题 2.1、对目标串 abaabcc和模式串aabc,描述根据KMP算法进行匹配的过程,包括失效函数计算。答:失效函数:-1, 0, -1, -1 目标串 abaabcc和模式串aabc的KMP算法进行匹配的过程 abaabcc aabc 首先,从目标位置0和模式位置0开始比较,至ab和aa,不等时目标位置为1, 模式位置为1。因0位置失效函数的值( f [posP-1] ) 为-1,从目标位 置1和模式位置0开始新一轮比较。因第一个字符( posP == 0 )就不等,目标 位置增1,目标位置2和模式位置0开始新一轮比较,直到模式位置比较至4, 匹配成功。 int fastFind ( char *s, char * pat ){ //带失效函数的KMP匹配算法 int posP = 0, posT = 0; int lengthP = strlen(pat), lengthT = strlen(s); while ( posP < lengthP && posT < lengthT ) if ( pat[posP] == s[posT] ) { posP++; posT++; //相等继续比较 } else if ( posP == 0 ) posT++; //不相等 else posP = f [posP-1]+1; if ( posP < lengthP ) return -1; else return posT - lengthP; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值