GDPU 数据结构 天码行空12

文章目录

  • 数据结构实验十二 图的遍历及应用
    • 一、【实验目的】
    • 二、【实验内容】
    • 三、实验源代码
      • 🍻 CPP
      • 🍻 C

数据结构实验十二 图的遍历及应用

一、【实验目的】

1、 理解图的存储结构与基本操作;
2、熟悉图的深度度优先遍历和广度优先遍历算法
3、掌握图的单源最短路径算法

二、【实验内容】

1.根据下图邻接矩阵,编程实现该图的深度与广度优先遍历算法,输出遍历序列。
在这里插入图片描述

2.单源节点最短路径问题
问题描述:求从有向图的某一结点出发到其余各结点的最短路径。
基本要求:
(1)有向图采用邻接矩阵表示。
(2)单源节点最短路径问题采用Dijkstra算法。
(3)输出有向图中从源结点T到其余各结点的最短路径和最短路径值。

三、实验源代码

🍻 CPP

#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;const int N = 6;
const int M = N*N;
const int INF = 0x3f3f3f3f;
const int 无边 = -1;int g[N][N]; //grap数组记录邻接矩阵【-1 表示不可达】
bool vs[N];//visted数组记录结点是否已经被访问过void add(int a, int b, int c)
{// 邻接矩阵加边g[a][b] = c;
}void init()
{for(int i = 0; i < N; i++)for(int j = 0; j < N; j++)g[i][j] = 无边;//初始化为不可达状态【-1】// A B C D E F// 0 1 2 3 4 5// 加边add(1, 0, 2);add(2, 1, 15);add(0, 2, 5);add(0, 3, 30);add(2, 5, 7);add(1, 4, 8);add(4, 3, 4);add(5, 3, 10);add(5, 4, 18);
}void print()
{// 输出邻接矩阵cout << "输出邻接矩阵:" << endl;cout << "   A  B  C  D  E  F" << endl;char c = 'A';for (int i = 0; i < N; i++){cout << c++ << "  ";for (int j = 0; j < N; j++)printf("%-2d ",g[i][j]);
//          cout << g[i][j] << " ";cout << endl;}
}//深度优先遍历
// u 是当前访问的点
void dfs(int u)
{cout << char(u+'A') << " " ;vs[u] = true;//标记以访问for(int i = 0; i < N; i++)//访问当前结点可达的结点(有边){int e = g[u][i];if(vs[i])//已访问过continue;if(e == 无边)//无边continue;dfs(i);		}
}//广度优先遍历
// u 是当前访问的点
void bfs(int u)
{memset(vs,false,sizeof(vs));//初始化访问表为 未访问状态vs[u] = true;queue<int> q;//队列(先进先出)q.push(u);while(!q.empty()){int t = q.front();//取队头cout << char(t+'A') << " " ;q.pop();//队头出列for(int i = 0; i < N; i++)//访问当前结点可达的结点(有边){int e = g[t][i];if(vs[i])//已访问过continue;if(e == 无边)//无边continue;q.push(i);vs[i] = true;}}
}int dist[N];//距离数组
int pre[N];//pre[i] 记录最短路径上,点 i 的前一个结点
//输出路径
void printRoute(int x)
{cout << "\nA到" << char(x + 'A') << "的最短路径长度为: " << dist[x] << endl;cout << "最短路径途径节点:";vector<int> v;while(x != -1){v.push_back(x);x = pre[x];}for(int i = v.size()-1; i >= 0; i--)cout << char(v[i]+'A') << " " ;cout << endl;
}//单源最短路 Dijkstra算法
void dijkstra(int u)//u表示起点
{cout << "\n\nDijkstra算法求最短路径"<<endl;memset(vs,false,sizeof(vs));//初始化访问表为 未访问状态memset(dist,0x3f,sizeof(dist));//初始化距离表为 无穷大memset(pre,-1,sizeof(pre));//初始化所有结点的前一个节点为 -1dist[u] = 0;for(int i = 0; i < N; i++){int t = -1;for(int j = 0; j < N; j++)//找n次{if(!vs[j] && (t == -1 || dist[j] < dist[t]))//循环找当前最小距离的点t = j;}printRoute(t);vs[t] = true;for(int j = 0; j < N; j++)//用当前最小距离的点尝试去更新其他点的距离{if(g[t][j] == 无边)continue;if(dist[j] > dist[t] + g[t][j]){dist[j] = dist[t] + g[t][j];pre[j] = t;//记录前驱节点}}	}	
}
int main()
{init(); // 初始化图print(); // 输出邻接矩阵和邻接表cout<< "\n深度优先遍历:";memset(vs,false,sizeof(vs));//初始化访问表为 未访问状态dfs(0);cout<< "\n广度优先遍历:";bfs(0);dijkstra(0);return 0;
}

🍻 C

#include<stdio.h>
#include<string.h>
#include<limits.h>
#include<stdbool.h>#define N 6
#define M (N * N)
#define INF 0x3f3f3f3f
#define NO_EDGE -1int g[N][N]; // graph数组记录邻接矩阵【-1 表示不可达】
bool vs[N]; // visited数组记录结点是否已经被访问过void add(int a, int b, int c)
{// 邻接矩阵加边g[a][b] = c;
}void init()
{for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){g[i][j] = NO_EDGE; // 初始化为不可达状态【-1】}}// A B C D E F// 0 1 2 3 4 5// 加边add(1, 0, 2);add(2, 1, 15);add(0, 2, 5);add(0, 3, 30);add(2, 5, 7);add(1, 4, 8);add(4, 3, 4);add(5, 3, 10);add(5, 4, 18);
}void print()
{// 输出邻接矩阵printf("输出邻接矩阵:\n");printf("   A  B  C  D  E  F\n");char c = 'A';for (int i = 0; i < N; i++){printf("%c  ", c++);for (int j = 0; j < N; j++){if (g[i][j] == NO_EDGE){printf(" - ");}else{printf("%-2d ", g[i][j]);}}printf("\n");}
}//深度优先遍历
// u 是当前访问的点
void dfs(int u)
{printf("%c ", u + 'A');vs[u] = true; // 标记已访问for (int i = 0; i < N; i++) // 访问当前结点可达的结点(有边){int e = g[u][i];if (vs[i]) // 已访问过continue;if (e == NO_EDGE) // 无边continue;dfs(i);}
}//广度优先遍历
// u 是当前访问的点
void bfs(int u)
{memset(vs, false, sizeof(vs)); // 初始化访问表为未访问状态vs[u] = true;printf("%c ", u + 'A');int queue[N];int front = 0, rear = 0;queue[rear++] = u;while (front != rear){int t = queue[front++];for (int i = 0; i < N; i++) //访问当前结点可达的结点(有边){int e = g[t][i];if (vs[i]) //已访问过continue;if (e == NO_EDGE) //无边continue;printf("%c ", i + 'A');queue[rear++] = i;vs[i] = true;}}
}int dist[N];   //距离数组
int pre[N];    //pre[i] 记录最短路径上,点 i 的前一个结点//输出路径
void printRoute(int x)
{printf("\nA到%c的最短路径长度为:%d\n", x + 'A', dist[x]);printf("最短路径途径节点:");int v[N], cnt = 0;while (x != -1){v[cnt++] = x;x = pre[x];}for (int i = cnt - 1; i >= 0; i--){printf("%c ", v[i] + 'A');}printf("\n");
}//单源最短路 Dijkstra算法
void dijkstra(int u) //u表示起点
{printf("\n\nDijkstra算法求最短路径\n");memset(vs, false, sizeof(vs));   //初始化访问表为未访问状态memset(dist, INF, sizeof(dist)); //初始化距离表为无穷大memset(pre, -1, sizeof(pre));    //初始化所有结点的前一个节点为-1dist[u] = 0;for (int i = 0; i < N; i++){int t = -1;for (int j = 0; j < N; j++) //找n次{if (!vs[j] && (t == -1 || dist[j] < dist[t])) //循环找当前最小距离的点t = j;}printRoute(t);vs[t] = true;for (int j = 0; j < N; j++) //用当前最小距离的点尝试去更新其他点的距离{if (g[t][j] == NO_EDGE)continue;if (dist[j] > dist[t] + g[t][j]){dist[j] = dist[t] + g[t][j];pre[j] = t; //记录前驱节点}}}
}int main()
{init();  // 初始化图print(); // 输出邻接矩阵和邻接表printf("\n深度优先遍历:");memset(vs, false, sizeof(vs)); //初始化访问表为未访问状态dfs(0);printf("\n广度优先遍历:");bfs(0);dijkstra(0);return 0;
}

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

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

相关文章

WEB渗透—反序列化(九)

Web渗透—反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩哔_…

centos7内核升级(k8s基础篇)

1.查看系统内核版本信息 uname -r 2.升级内核 2.1更新yum源仓库 yum -y update更新完成后&#xff0c;启用 ELRepo 仓库并安装ELRepo仓库的yum源 ELRepo 仓库是基于社区的用于企业级 Linux 仓库&#xff0c;提供对 RedHat Enterprise (RHEL) 和 其他基于 RHEL的 Linux 发行…

企业计算机服务器中了mallox勒索病毒如何解密,mallox勒索病毒文件恢复

随着网络技术的不断发展&#xff0c;网络安全威胁也在不断增加&#xff0c;勒索病毒攻击企业计算机服务器的事件时有发生&#xff0c;并且勒索病毒的加密形式也越来越复杂。近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mallox…

单片机----串行通信

目录 串行通信的两种方式 串行通信的传输模式 串行通信的错误校验 1.奇偶校验 2.代码和校验 3.循环冗余码校验 串行口结构 串行口控制寄存器SCON 特殊功能寄存器PCON 串行口的4种工作方式 方式0&#xff1a; &#xff08;1&#xff09;方式0的发送过程 &#xff0…

如何使用阿里云虚拟主机和域名设置网站?

本文档将向您展示如何使用阿里云虚拟主机来设置一个新网站&#xff0c;并完成一个域名。如果您按照此处的步骤操作&#xff0c;您将启动并运行一个新网站&#xff0c;可以使用您选择的名称在全球范围内访问&#xff0c;并托管在阿里云平台上。 本文档假设您已经拥有有效的阿里…

InstructDiffusion-多种视觉任务统一框架

论文:《InstructDiffusion: A Generalist Modeling Interface for Vision Tasks》 github&#xff1a;https://github.com/cientgu/InstructDiffusion InstructPix2Pix&#xff1a;参考 文章目录 摘要引言算法视觉任务统一引导训练集重构统一框架 实验训练集关键点检测分割图像…

微信小程序本地和真机调试文件上传成功但体验版不成功

可能是微信小程序ip白名单的问题&#xff0c;去微信公众平台&#xff08;小程序&#xff09;上设置小程序的ip白名单 1、在本地中取消不校验 然后在本地去上传文件&#xff0c;就会发现控制台报错了&#xff0c;会提示一个https什么不在ip白名单&#xff0c;复制那个网址 2、…

tomcat调优配置

一. 设置账户进入管理页面 通过浏览器进入Tomcat7的管理模块页面&#xff1a;http://localhost:8080/manager/status 按照提示&#xff0c;在Tomcat7服务器指定的位置修改配置文件&#xff08;conf/tomcat-users.xml&#xff09;&#xff0c;增加相应的用户和角色配置标签 <…

win11系列:避坑宝典|win11升级最新预览体验版bug梳理

win11系列&#xff1a;避坑宝典|win11升级最新预览体验版bug梳理 一、亲测win11升级的前世今生。&#xff08;一&#xff09;问题描述梳理。&#xff08;二&#xff09;故障原因分析。&#xff08;三&#xff09;具体解决方案。2.【已解决】①尝试关Hyper-v重启&#xff1b;②从…

基于AOP的声明式事物控制

目录 Spring事务编程概述 基于xml声明式事务控制 事务属性 isolation timeout read-only propagation 全注解开发 Spring事务编程概述 事务是开发中必不可少的东西&#xff0c;使用JDBC开发时&#xff0c;我们使用connection对事务进行控制&#xff0c;使用MyBatis时&a…

Django大回顾 -3 之响应对象、cbv和fbv、关于类中self是谁的问题、上传文件、模版

【1】isinstance方法 判断一个对象是否是一个已知的类型。 isinstance语法&#xff1a; isinstance(object&#xff0c;classinfo) object --------- 实例化对象 cassinfo ------- 可以是字节或间接类名、基本类型&#xff0c;或者由他们组成的元组 相同返回True&#xff0c;不…

肖sir__mysql之视图__009

mysql之视图 一、什么是视图 视图是一个虚拟表&#xff08;逻辑表&#xff09;&#xff0c;它不在数据库中以存储形式保存&#xff08;本身包含数据&#xff09;&#xff0c;是在使用视图的时候动态生成。 二、视图作用 1、查询数据库中的非常复的数据 例如&#xff1a;多表&a…

本地部署GPT的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

微机原理_8

一、单项选择题&#xff08;本大题共 15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案&#xff0c;请将选定的答案填涂在答题纸的相应位置上。 1,微机内部除CPU外还集成了计算机的其它主要部件,如ROM、RAM、并…

LeetCode(38)生命游戏【矩阵】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 生命游戏 1.题目 根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是…

shell---免交互

一、多行重定向 可以理解为这是标准输入的一种替代品&#xff0c;可以帮助脚本开发人员不必使用临时文件来构建输入信息&#xff0c;可以直接产生一个文件&#xff0c;输入文件信息&#xff0c;常与非交互程序和命令一起使用 语法格式命令<< 标记..........标记 注意…

During handling of the above exception, another exception occurred解决方案

During handling of the above exception, another exception occurred解决方案 前言解决方案总结 前言 今天在写python读取图片中的内容的脚本的时候&#xff0c;常用的图像处理库包括Pillow和OpenCV。以下是使用Pillow库读取图片中的计算公式的示例代码&#xff1a; from P…

详解原生Spring当中的额外功能开发MethodBeforeAdvice与MethodInterceptor接口!

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

Redis对象系统

前言 在Redis中有许多数据结构&#xff0c;比如&#xff1a;简单动态字符串(SDS)&#xff0c;双端链表&#xff0c;字典&#xff0c;压缩列表&#xff0c;整数集合等。 Redis并没有直接使用这些数据结构来实现键值对数据库&#xff0c;而是基于这些数据结构创建了一个对象系统。…

vue项目运行时,报错:ValidationError: webpack Dev Server Invalid Options

在运行vue项目中&#xff0c;遇到报错&#xff1a;ValidationError: webpack Dev Server Invalid Options&#xff0c;如下图截图&#xff1a; 主要由于vue.config.js配置文件错误导致的&#xff0c;具体定位到proxy配置代理不能为空&#xff0c;导致运行项目报错&#xff0c;需…