NOJ-用迪杰特斯拉算法求赋权图中的最短路径-西工大数据结构

本文介绍了一个基于Dijkstra算法的改进版本,通过调整算法中的几个关键函数来提高寻找最短路径的效率。具体改动包括遍历方式、判断条件及输出过程等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    边看锤子的发布会边改出来的,他那发布会的演示真是尴尬死了,所以我写了个烂代码(我实在不想重写了)。。。题目如下:


    还是dj算法,我就把其中的dj相关函数改了一下,记录一下stepN中到终点的距离,如果改变了,说明min就是要走的结点,如果终点被更新掉了,说明已经找到到终点的最短走法,直接跳出结束就行了。

    其中改变了这几个函数,就是遍历时改为从头开始,判断输出一下就可以了:

void DJ(struct step *gStep,struct graphList *gList);
void initializeStep(struct step *gStep,struct graphList *gList);
int judgeStep(struct step *gStep,struct graphList *gList);
int findMinStepN(struct step *gStep,struct graphList *gList);
void updateStepN(struct step *gStep,struct graphList *gList,int min);

    以下是我的实现:

#include <stdio.h>
#include <stdlib.h>

struct graphList
{
    int vexNum;
    int graph[120][120];
};

struct step
{
    int flags[3000];
    int stepN[3000];
};

void run();
void createNewGraphList (struct graphList *gList);
void DJ(struct step *gStep,struct graphList *gList);
void clearStep(struct step *gStep,struct graphList *gList);
void initializeStep(struct step *gStep,struct graphList *gList);
int judgeStep(struct step *gStep,struct graphList *gList);
int findMinStepN(struct step *gStep,struct graphList *gList);
void updateStepN(struct step *gStep,struct graphList *gList,int min);

int main()
{
    run ();
    return 0;
}

void run()
{
    struct graphList gList;
    struct step gStep;
    createNewGraphList (&gList);
    DJ (&gStep,&gList);
}

void createNewGraphList(struct graphList *gList)
{
    int i,j;
    scanf ("%d",&(gList->vexNum));
    for (i=0;i<gList->vexNum;i++)
    {
        for (j=0;j<gList->vexNum;j++)
        {
            scanf ("%d",&(gList->graph[i][j]));
        }
    }
}

void DJ(struct step *gStep,struct graphList *gList)
{
    int min;
    int end,endStep;
    clearStep (gStep,gList);
    initializeStep (gStep,gList);
    scanf ("%d",&end);
    endStep=gStep->stepN[end];
    while (judgeStep (gStep,gList))
    {
        min=findMinStepN (gStep,gList);
        updateStepN (gStep,gList,min);
        if (gStep->flags[end])
        {
            if (endStep!=gStep->stepN[end])
            {
                endStep=gStep->stepN[end];
                printf ("%d\n",min);
            }
        }
        else
        {
            printf ("%d\n",min);
            break;
        }
    }
}

void clearStep(struct step *gStep,struct graphList *gList)
{
    int i;
    for (i=0;i<gList->vexNum;i++)
    {
        gStep->flags[i]=-1;
        gStep->stepN[i]=0;
    }
}

void initializeStep(struct step *gStep,struct graphList *gList)
{
    int i;
    int start;
    scanf ("%d",&start);
    printf ("%d\n",start);
    for (i=0;i<gList->vexNum;i++)
    {
        if (gList->graph[start][i]!=10000)
        {
            gStep->flags[i]=1;
            gStep->stepN[i]=gList->graph[start][i];
        }
    }
    gStep->flags[start]=-1;
    gStep->stepN[start]=0;
}

int judgeStep(struct step *gStep,struct graphList *gList)
{
    int i;
    for (i=0;i<gList->vexNum;i++)
    {
        if (gStep->flags[i]==1)
        {
            return 1;
        }
    }
    return 0;
}

int findMinStepN(struct step *gStep,struct graphList *gList)
{
    int i,min=99999,n=-1;
    for (i=0;i<gList->vexNum;i++)
    {
        if (gStep->flags[i]==1)
        {
            if (gStep->stepN[i]<min)
            {
                min=gStep->stepN[i];
                n=i;
            }
        }
    }
    return n;
}

void updateStepN(struct step *gStep,struct graphList *gList,int min)
{
    int i;
    int minStepN=gStep->stepN[min];
    gStep->flags[min]=0;
    for (i=0;i<gList->vexNum;i++)
    {
        if (gStep->flags[i]==1)
        {
            if (gStep->stepN[i]>gList->graph[min][i]+minStepN)
            {
                gStep->stepN[i]=gList->graph[min][i]+minStepN;
            }
        }
        else
        {
            if (gStep->flags[i]==-1)
            {
                gStep->flags[i]=1;
                gStep->stepN[i]=gList->graph[min][i]+minStepN;
            }
        }
    }
}

### 关于2024年西北工业大学数据结构NOJ题目练习 针对2024年的具体题目尚未公开发布,但可以通过以往的经验推测可能涉及的内容以及准备方式。以下是关于如何查找和准备相关内容的详细说明: #### 一、历年NOJ题目特点分析 根据过往经验[^1],西工大NOJ中的题目涵盖了基础算法数据结构的核心知识点。这些题目不仅考察学生对理论的理解能力,也注重实际编程实现的能力。例如,在数据结构方面,可能会涉及到链表操作、矩阵存储形式(如十字链表)、树形结构遍历等问题。 #### 二、推荐的数据结构重点复习方向 基于常见的数据结构考点,建议重点关注以下几个领域: - **链表的操作**:掌握单向链表、双向链表的基本增删改查功能。 - **稀疏矩阵表示法**:了解并熟练运用十字链表来表示稀疏矩阵[^2]。 ```c typedef struct CrossList{ OLink* rHead; OLink* cHead; int mu, nu, tu; // 行数、列数、非零元个数 } CrossList; ``` - **图论基础知识**:熟悉邻接矩阵和邻接表两种存储方法及其应用场景。 - **堆栈与队列的应用场景**:理解其在括号匹配、迷宫解等经典问题中的作用。 #### 三、备考资源整理 为了更好地应对考试或者日常训练需,可以从以下几类资料入手学习: 1. 参考历史上的优秀总结文章,比如提到过的《2023西工大NOJ (C语言版) 完结!!!》这类博文,它提供了较为全面的小模板集合。 2. 利用在线评测平台LeetCode、牛客网等寻找相似难度等级下的习题集进行专项突破。 3. 结合教材深入研究典型例题解答过程,提高解决复杂问题的能力。 #### 四、实践建议 通过不断刷题巩固所学知识是最有效的途径之一。尝试按照专题分类完成一定数量的相关题目,并记录下容易出错的地方加以改正。同时也要注意时间管理技巧,在规定时间内高效完成给定任务。 ```python def is_prime(n): """判断n是否为质数""" if n <= 1: return False elif n == 2 or n == 3: return True else: for i in range(2,int(n**0.5)+1): if not n % i : return False return True ``` 上述代码片段展示了一个简单的函数用于检测某个整数是不是素数,这是属于“判断素数”的小模板实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值