图的最短路径 (数据结构实验报告)

这篇具有很好参考价值的文章主要介绍了图的最短路径 (数据结构实验报告)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实验目的

讲清楚进行本实验后要学到的知识、掌握的数据结构及其定义和表示方法,讲清楚所采用的算法。

掌握图结构的(邻接矩阵)输入方法

掌握图结构的说明、创建以及图的存储表示(邻接矩阵)

掌握最短路径算法原理

掌握最短路径算法的编程实现方法

二、实验要求

讲清楚进行本实验之前需要的先验知识及条件

熟悉C++语言编程

熟悉图的邻接矩阵存储表示

熟悉最短路径算法原理

熟悉使用C++语言,实现最短路径算法

先验知识:

迪杰特斯拉算法思想:

设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一章为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径,就将加入到集合S中。直到全部顶点都加入到S中,算法就结束了)。第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点V到S中各顶点的最短路径长度大于从源点V到V中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从V到此顶点的最短路径长度,V中的顶点的距离是从V到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

三、实验内容

讲清楚本实验的内容,以及为实现实验内容所采用算法的原理

图的最短路径 (数据结构实验报告)

图的最短路径 (数据结构实验报告)

图的最短路径 (数据结构实验报告)

图的最短路径 (数据结构实验报告)

图的最短路径 (数据结构实验报告)

四、实验步骤

图的最短路径 (数据结构实验报告)

图的最短路径 (数据结构实验报告)

图的最短路径 (数据结构实验报告)

图的最短路径 (数据结构实验报告)

图的最短路径 (数据结构实验报告)

图的最短路径 (数据结构实验报告)

图的最短路径 (数据结构实验报告)

图的最短路径 (数据结构实验报告)

                                                             

五、完整代码(可直接run)  (编译环境vscode)

#include<stdio.h>

#define MAXVERTEXNUM 100 //定义数组长度

#define INFINITY 100//定义无穷

struct Graph{

    int VertexNum;//图中顶点个数

    char Vertex[MAXVERTEXNUM];//将图的顶点字母存入数组

    int AdjMatrix[MAXVERTEXNUM][MAXVERTEXNUM];//设置领接矩阵用两个数组

};

Graph MGraph;

char Path[MAXVERTEXNUM][MAXVERTEXNUM];//设置图的邻接矩阵

int Dest[MAXVERTEXNUM];//全局设置权值

void CreateGraph(Graph *G);//生成图调用函数

void ShowGraph(Graph *G);//展示图调用函数

void ShortestPath(Graph *G, char StartVexChar);//测试路径

void ShowPath(Graph *G); //展示路径

int main(){  

    char StartVex;//

   

    CreateGraph(&MGraph);

    ShowGraph(&MGraph);

    printf("请输入开始的顶点");

    scanf("%c", &StartVex);

    ShortestPath(&MGraph, StartVex);

    ShowPath(&MGraph);

    return 0;

}文章来源地址https://www.toymoban.com/news/detail-457063.html

//

void CreateGraph(Graph *G){

    int i, j;

   

    printf("请输入顶点个数\n");

    scanf("%d", &G->VertexNum);

    printf("请输入顶点\n");

    getchar();

    for(i = 1; i <= G->VertexNum; i++){

        scanf("%c", &G->Vertex[i]);

        getchar();

    }

    printf("请输入邻接矩阵\n");

    for(i = 1; i <= G->VertexNum; i++){

        for(j = 1; j <= G->VertexNum; j++){

            scanf("%d", &G->AdjMatrix[i][j]);

            getchar();

            if(G->AdjMatrix[i][j] == -1)

               G->AdjMatrix[i][j] = INFINITY;

        }  

    }

}

void ShowGraph(Graph *G){

    int i, j;

    for(i = 1; i <= G->VertexNum; i++){

        printf("%c ", G->Vertex[i]);

    }

    putchar('\n');

    for(i = 1; i <= G->VertexNum; i++){

        for(j = 1; j <= G->VertexNum; j++){

            printf("%d ", G->AdjMatrix[i][j]);

        }

        putchar('\n');  

    }

}

void ShortestPath(Graph *G, char StartVexChar){

    int i, j, m, StartVex, CurrentVex, MinDest, Final[MAXVERTEXNUM];

    for (i = 1; i <= G->VertexNum; i++){

        if(G->Vertex[i] == StartVexChar){

            StartVex = i;

            break;

        }

    }

    for (i = 1; i <= G->VertexNum; i++){

        Path[i][0] = 0;

        Dest[i] = INFINITY;

        if(G->AdjMatrix[StartVex][i] < INFINITY){

            Dest[i] = G->AdjMatrix[StartVex][i];

            Path[i][1] = G->Vertex[StartVex];

            Path[i][2] = G->Vertex[i];

            Path[i][0] = 2;

        }

        Final[i] = 'F';

    }

    Dest[StartVex] = 0;

    Final[StartVex] = 'T';

    for (i = 1; i <= G->VertexNum; i++){

        MinDest = INFINITY;

        for (j = 1; j <= G->VertexNum; j++){

            if(Final[j] == 'F'){

                if(Dest[j] < MinDest){

                    CurrentVex = j;

                    MinDest = Dest[j];

                }

            }

        }

        Final[CurrentVex] = 'T';

        for (j = 1; j <= G->VertexNum; j++){

            if((Final[j] == 'F') && (MinDest + G->AdjMatrix[CurrentVex][j]) < Dest[j]){

                Dest[j] = MinDest + G->AdjMatrix[CurrentVex][j];

                for(m = 0; m <= Path[CurrentVex][0]; m++)

                    Path[j][m] = Path[CurrentVex][m];

                Path[j][0]++;

                Path[j][Path[j][0]] = G->Vertex[j];

            }

        }    

    }  

}

void ShowPath(Graph *G){

    int i, j;

    for(i= 1; i <= G->VertexNum; i++){

        printf("%c(%d):", G->Vertex[i], Dest[i]);

        if(Path[i][0] > 0){

            for(j = 1; j <= Path[i][0]; j++){

                printf(" %c", Path[i][j]);

            }      

        }

        printf("%c\n", Path[i][j]);

    }

}

到了这里,关于图的最短路径 (数据结构实验报告)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构(12)Dijkstra算法JAVA版:图的最短路径问题

    目录 12.1.概述 12.1.1.无权图的最短路径  12.1.2.带权图的最短路径 1.单源最短路径 2.多源最短路径 12.2.代码实现 无权图的最短路径,即最少步数,使用BFS+贪心算法来求解最短路径,比较好实现,此处不做展开讨论。 有权图的最短路径,不考虑权重为负数的情况,因为权重为负

    2024年02月06日
    浏览(44)
  • 数据结构实验任务六 :基于 Dijsktra 算法的最短路径求解

    本次代码为实验六:基于 Dijsktra 算法的最短路径求解实现。本实验的重点在于对于Dijsktra算法的理解。有关Dijsktra的资料可以参考有关博文: 图论:Dijkstra算法——最详细的分析,图文并茂,一次看懂!-CSDN博客 以下附上实现代码: 以上代码仅供参考,欢迎交流。

    2024年02月04日
    浏览(45)
  • 《数据结构》实验报告六:图的表示与遍历

    1、掌握图的 邻接矩阵 和 邻接表 表示 2、掌握图的 深度优先 和 广度优先 搜索方法 3、理解 图的应用 方法 说明以下概念 1、深度优先搜索遍历:        一种图的遍历方式:从图中 任意一个 起始顶点 V 出发,接着访问它的任意一个 邻接顶点 W1 ;再从 W1 出发,访问与 W1

    2024年02月06日
    浏览(57)
  • 数据结构实验报告(三)——图的操作和实现

    1.掌握图的基本概念、性质与应用问题 2.掌握图的邻接矩阵与邻接表存储方式; 3.掌握图的有关算法,如创建、遍历、连通分量、生成树/最小生成树算法(如Prim、Kruskal算法)等; 1.建立与存储 邻接矩阵:采用二维数组来存储顶点之间的相邻关系,若两个顶点之间有直连边

    2024年02月06日
    浏览(49)
  • 实验报告——基于Dijsktra算法的最短路径求解

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com Last edited: 2022.12.3   目录 一、实验目的 二、实验设备 三、实验内容 【问题描述】 【输入要求】 【输出要求】 【输入样例】 【输出样例】 四、实验提示 五、实验步骤 5.1 六、实验结果 6.1程序完成后

    2024年02月07日
    浏览(45)
  • java数据结构与算法刷题-----LeetCode1091. 二进制矩阵中的最短路径

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 双分裂蛇:是求二维表中从起点到终点的经典思路(也是求无权图的最短路径问题的经典解法)。创建两条分裂蛇,分别从起点和

    2024年04月26日
    浏览(44)
  • 大二数据结构实验(迪杰斯特拉最短路径)

    大二数据结构实验,有详细批注,代码可以直接运行,希望可以给大家提供到帮助。 实验目的 掌握图的邻接矩阵的存储定义。 掌握图的最短路径(Dijsktra)算法的实现。 实验内容 设计校园平面图,所含景点不少于8个。以图中顶点表示学校内各景点,存放景点的名称、景点

    2024年02月12日
    浏览(40)
  • 【数据结构】图的应用:最小生成树;最短路径;有向无环图描述表达式;拓扑排序;逆拓扑排序;关键路径

    目录 1、最小生成树 1.1 概念  1.2 普利姆算法(Prim) 1.3 克鲁斯卡尔算法(Kruskal)  2、最短路径 2.1 迪杰斯特拉算法(Dijkstra) 2.2 弗洛伊德算法(Floyd)  2.3 BFS算法,Dijkstra算法,Floyd算法的对比 3、有向无环图描述表达式 3.1 有向无环图定义及特点 3.2 描述表达式 4、拓扑排序

    2024年02月07日
    浏览(46)
  • 《数据结构》实验报告七:查找

    1、掌握 查找表 、 动态查找表 、 静态查找表 和 平均查找长度 的概念。 2、掌握线性表中 顺序查找 和 折半查找 的方法。 3、学会 哈希函数 的构造方法, 处理冲突 的机制以及 哈希表的查找 。 说明以下概念 1、顺序查找:         顺序查找又叫 线性查找 ,是最基本的查

    2024年02月06日
    浏览(41)
  • 数据结构专题实验7——图的应用(景点管理)(C++实现)

    实验内容:应用图的技术,根据需求文件要求的功能,实现旅游景点的管理。实验要求: 使用图的数据结构建立一个景点图的结构。 可以查找各景点信息。 旅游景点导航,使用深度优先,从一个景点开始遍历所有景点。 查找一个景点到另一个景点的最短路径。 对景点道路

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包