数据结构实验头歌 第1关:求图的最短路径

news2024/11/23 4:19:11

任务描述
本关任务:编程实现求图的最短路径
相关知识
最短路径的Dijkstra算法:
求最短路径就是求图中的每一个点到图中某一个给定点(认为编号为0的点)的最短距离。
具体算法就是初始有一个旧图,一个新图。开始时旧图中有所有的结点,新图中初始为只有一个结点(源点,路径的源头)。整个算法就是不停的从旧图中往新图中添加点,直到所有的点都添加到新图中为止。
编程要求
根据提示,在右侧编辑器补充代码,计算并输出图的最短路径
测试说明
平台会对你编写的代码进行测试:
测试输入:按照指导书上图的数据进行输入
预期输出:
(1^5) (2^3) (4^2)
(2^2) (3^6)
(1^1) (3^2)
(1^6) (2^10) (3^4)
0@0,1@4,2@3,3@5,4@2


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

char infomation[20];
//输入图
//1 5 2 3 4 2:
//3 6 2 2:
//3 2 1 1:
//:
//1 6 2 10 3 4:

typedef struct{
    int length;//最短路径长度
    int prevex;//从V0到Vi的最短路径上Vi的前驱节点
}Path;

Path *dist;

int main(int argc, const char * argv[]) {
    int number = 5;

    int arcs[5][5]={
        {0,5,3,65535,2},
        {65535,0,2,6,65535},
        {65535,1,0,2,65535},
        {65535,65535,65535,0,65535},
        {65535,6,10,4,0}
    };

    dist = (Path*)malloc(sizeof(Path)*number);
    

    for(int i=0;i<number;i++){
        for(int j=0;j<number;j++){
            if(arcs[i][j]!=0&&arcs[i][j]!=65535){
                printf("(%d^%d)",j,arcs[i][j]);
                if(i==0&&j==4)printf(" ");
                for(int k=j+1;k<number;k++)
                    if(arcs[i][k]!=0&&arcs[i][k]!=65535){
                        printf(" ");
                        break;
                    }
            }
        }
        printf("\n");
    }
    //初始化指定顶点V0到V-U中各顶点的距离
    int i;
    dist[0].length=0;
    dist[0].prevex=0;
    arcs[0][0] = 1;
    for(i=1;i<number;i++){
        dist[i].length = arcs[0][i];
        if(dist[i].length!=65535)dist[i].prevex = 0;
        else dist[i].prevex = -1;
    }
    int j,mv;
    int min;
    for(i=1;i<number;++i){
        min = 65535;mv=0;
        for(j=1;j<number;++j)
            if(arcs[j][j]==0&&dist[j].length<min){
                mv = j;min=dist[j].length;
            }
        if(mv==0)break;
        arcs[mv][mv]=1;
        for(j=1;j<number;j++){
            if(arcs[j][j]==0&&dist[j].length>dist[mv].length+arcs[mv][j]){
                dist[j].prevex = mv;
                dist[j].length = dist[mv].length + arcs[mv][j];
            }
        }
    }

    for(i = 0;i<number-1;i++)printf("%d@%d,",i,dist[i].length);
    printf("%d@%d",i,dist[i].length);

    return 0;
}

在这里插入图片描述

如果是写实验报告,可以用下面的代码

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

char infomation[20];
//输入数据 5
//1 5 2 3 4 2:
//3 6 2 2:
//3 2 1 1:
//:
//1 6 2 10 3 4:

typedef struct{
    int length;//最短路径长度
    int prevex;//从V0到Vi的最短路径上Vi的前驱节点
}Path;

Path *dist;

int main(int argc, const char * argv[]) {
    int number;
    printf("Enter a network. The minimal weights of paths from vertex 0 to other vertices\n");
    printf("How many vertices in the digraph (between 1 and 10)?");
    scanf("%d",&number);
    int arcs[number][number];
    dist = (Path*)malloc(sizeof(Path)*number);
    for(int i = 0;i<number;i++)
        for (int j=0; j<number ; j++)
            arcs[i][j]=0;
    printf("For each vertex, give the vertices to which it points.\nand the corresponding directed edge weight.\nType the pairs of numbers (terminated by a : for each vertex), separated by blanks.\n");
    for(int i=0;i<number;i++){
        printf("Vertex %d : ",i);
        fflush(stdin);
        fgets(infomation,20,stdin);
        int flag = 0;
        char temp='0';
        for(int j = 0;j<20;j++){
            if(infomation[j]==' ')continue;
            else if(infomation[j]==':')break;
            if(flag==0){
                temp = infomation[j];
                flag = 1;
            }else if(flag==1){
                arcs[i][temp-'0'] = infomation[j]-'0';
                if(infomation[j+1]!=' '&&infomation[j+1]!=':'){
                    arcs[i][temp-'0']*=10;
                    flag=3;
                    continue;
                }
                flag=0;
            }else if(flag==3){
                flag=0;
                continue;
            }
        }
        for(int j = 0;j<20;j++) infomation[j] = '0';
    }
    for(int i = 0;i<number;i++)
    {
        for (int j=0; j<number ; j++)
            if(i==j)arcs[i][j]=0;
            else if(arcs[i][j]==0)arcs[i][j]=65535;
    }
    printf("\nYou entered the graph:\n\n");
    for(int i=0;i<number;i++){
        printf("Vertex %d : ",i);
        for(int j=0;j<number;j++){
            if(arcs[i][j]!=0&&arcs[i][j]!=65535){
                printf("<%d^%d> ",j,arcs[i][j]);
            }
        }
        printf("\n");
    }
    //初始化指定顶点V0到V-U中各顶点的距离
    int i;
    dist[0].length=0;
    dist[0].prevex=0;
    arcs[0][0] = 1;
    for(i=1;i<number;i++){
        dist[i].length = arcs[0][i];
        if(dist[i].length!=65535)dist[i].prevex = 0;
        else dist[i].prevex = -1;
    }
    int j,mv;
    int min;
    for(i=1;i<number;++i){
        min = 65535;mv=0;
        for(j=1;j<number;++j)
            if(arcs[j][j]==0&&dist[j].length<min){
                mv = j;min=dist[j].length;
            }
        if(mv==0)break;
        arcs[mv][mv]=1;
        for(j=1;j<number;j++){
            if(arcs[j][j]==0&&dist[j].length>dist[mv].length+arcs[mv][j]){
                dist[j].prevex = mv;
                dist[j].length = dist[mv].length + arcs[mv][j];
            }
        }
    }
    printf("The minimal distances from vertex O to the other vertices are as follows:\n");
    for(i = 0;i<number;i++)printf("%d@%d, ",i,dist[i].length);
    printf("\n");
    return 0;
}

不得不说,学校出的头歌题目和实验报告都有点问题,已经向老师反馈了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/158437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux项目自动化构建工具-make/Makefifile

目录 背景 实例代码 依赖关系 依赖方法 原理 项目清理 可重复执行的依据 背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系…

K8s部署前后端分离项目(一)

K8s部署前后端分离项目 环境准备 K8s环境 主节点master&#xff1a;192.168.3.200 子节点node1&#xff1a;192.168.3.201 子节点node2&#xff1a;192.168.3.202 Harbor远程仓库 已部署在master主节点上&#xff0c;目录为&#xff1a;cd /workspace/harbor/harbor 1、登录地…

java使用XDocReport导出word

使用XDocReport 导出word效果word编辑器案例word模板模板制作解决图片不存在时, "现场照片" 列被隐藏问题依赖返回数据对象 DailyRecordReportOpinionVO 审核记录对象PicVo 图片对象导出接口效果 说明: “现场图片” 为动态图片列表 , “专业负责人审核意见” 和 “项…

freeswitch的多租户模式

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 现在的VOIP服务越来越倾向于云端服务&#xff0c;包括呼叫中心云服务&#xff0c;线路云平台。 而云平台对多个客户的服务就需要做好隔离&#xff0c;包括数据隔离、线路隔离、服务隔离等。 freeswitch内部的多租户模…

如何给视频批量添加背景图的实例操作教程

如何给视频添加上背景图片呢&#xff1f;有需要的宝宝跟着小编一起来看看怎么操作的吧。 先运行【云炫AI智剪】&#xff0c;然后再选择画中画&#xff0c;切换相对应的界面当中。 接下来把底画背景图导入到列表中&#xff0c;可以选中文件直接拖动到软件中&#xff0c;或者…

多次执行相同的push、replace问题(重写push、replace)

1.多次执行相同的push、replace问题编程式导航路由跳转到当前路由(参数不变), 多次执行会抛出NavigationDuplicated的警告错误注意:编程式导航&#xff08;push|replace&#xff09;才会有这种情况的异常&#xff0c;声明式导航是没有这种问题&#xff0c;因为声明式导航内部已…

你是真的“C”——详解C语言函数模块知识(上篇)

详解C语言函数模块知识(上篇&#xff09;&#x1f60e;前言&#x1f64c;1. 函数是什么⁉️2、C语言中函数的分类&#x1f64c;库函数&#xff1a;&#x1f603;自定义函数&#x1f603;**这里通过几个例子来辅助大家更好的理解函数如何用** ⁉️1、实现一个函数来交换两个整数…

C语言实现静态通讯录

专栏&#xff1a;C语言 每日一句&#xff1a;这几年可能会有点累&#xff0c;但要相信你的人生不可能就止于此地了&#xff0c;你要有你的梦想&#xff0c;所以你要努力&#xff0c;只有坚持这阵子&#xff0c;才不会辛苦一辈子&#xff0c;努力会让自己过得很好&#xff0c; 静…

Qt扫盲-QAction理论总结

QAction理论总结一、概述二、使用一、概述 在应用程序中&#xff0c;许多常用命令可以通过 菜单、工具栏按钮 和 键盘快捷键 调用。由于用户希望以相同的方式执行每个命令&#xff0c;而不管使用什么用户界面&#xff0c;因此将每个命令表示为一个Action操作是有效的。可以将A…

23年 车辆检测+车距检测+行人检测+车辆识别+车距预测(附yolo v5最新版源码)

我们先看一下效果2023年最新版 yolo车距行人识别yolov5和v7对比yolo车距其他步骤参考另外一篇文章&#xff1a; yolo 车辆测距车辆识别单目测距&#xff08;双目测距&#xff09;_SYBH.的博客-CSDN博客_yolo测距基于yolo目标检测算法实现的车前道路中的车辆和行人检测&#xf…

opener 值得注意的安全问题

前言 最近在学习浏览器知识的时候&#xff0c;讲到了浏览器之间的渲染进程共用的问题。其中 opener 能被引用到的两个页面&#xff0c;会在同一个渲染进程中。而这两个页面&#xff0c;可以称为&#xff1a;浏览上下文组。但在测试的时候&#xff0c;反倒是发现了一个opener 注…

JavaEE进阶第一课:Spring核心与设计思想

目录1.Spring是什么1.1什么是容器1.2什么是IoC1.3什么是DISpring的核心功能1.Spring是什么 用官方的话来说&#xff1a;Spring是包含众多工具方法的IoC容器 但是仅仅这样一句话&#xff0c;就会让大家有许多不解&#xff1f;什么是IoC&#xff1f;什么是容器&#xff1f;接下来…

python基础篇之字符串类型

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a;lqj_本人的博客_CSDN博客-微信小程序,前端,vue领域博主lqj_本人擅长微信小程序,前端,vue,等方面的知识https://blog.csdn.net/lbcyllqj?spm1000.2115.3001.5343 哔哩哔哩欢迎关注&…

Java字节流基础详解(InputStream/OutputStream)

文章目录概念InputStream字节输入流FileInputStream文件字节输入流FileOutputStream字节输出流相关的方法&#xff08;write&#xff09;和构造器构造器注意事项文件拷贝概念 在Java中&#xff0c;字节流一般适用于处理字节数据&#xff08;诸如图片、视频&#xff09;&#x…

Netty入门笔记(一)BIO、NIO、AIO

一.Netty简介 Netty是由JBOSS提供的一个java开源框架Netty是一个异步的&#xff0c;基于事件驱动的网络应用框架&#xff0c;用以快速开发高性能&#xff0c;高可靠性的网络IO程序Netty主要针对在TCP协议下&#xff0c;面向Client端的高并发应用&#xff0c;或者peer-to-peer场…

裁剪图片原理

FileReader HTML5定义了FileReader作为文件API的重要成员用于读取文件&#xff0c;根据W3C的定义&#xff0c;FileReader接口提供了读取文件的方法和包含读取结果的事件模型。 创建实例 const reader new FileReader(); 方法 事件 Blod Blob是用来支持文件操作的。简单的…

牛客每日一题(1/12)

233的字符串题目描述 读入一个正整数n&#xff0c;代表将字符串"abc"重复n次&#xff0c;形成一个长度为3n的字符串。例如n3时&#xff0c;形成的字符串为"abcabcabc"。请你计算该字符串中有多少个"acb"子序列。答案对10^97取模。输入描述:一个正…

【计算机网络-数据链路层】局域网(LAN)

文章目录1 局域网的概念1.1 局域网的拓扑结构1.2 局域网的传输介质1.3 局域网的介质访问控制方式&#xff08;MAC&#xff09;1.4 局域网的分类2 以太网&#xff08;Ethernet&#xff0c;IEEE 802.3 标准&#xff09;2.1 以太网的传输介质2.2 以太网的网卡2.3 以太网的 MAC 地址…

flutter apk 加固引发的问题

背景&#xff1a;Apk 加固&#xff0c;防止动态调试啥的&#xff0c;用的是 腾讯家的加固方案:应用加固&#xff0c;这个加固完之后 因为破壳了&#xff0c;所以需要重写签名&#xff1b;今天发现一个这样的问题&#xff1a;最早加固完毕安装不了提示&#xff1a;Failure IINST…

C语言从入门到放弃——静态通讯录实现

目录 一.功能实现 1.打印开始菜单 2.实现选择 3.初始化通讯录 4.添加、删除等功能实现 &#xff08;1&#xff09;添加联系人 &#xff08;2&#xff09;删除联系人 &#xff08;3&#xff09;查找联系人 &#xff08;4&#xff09;修改联系人 &#xff08;5&#xff…