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.hqwc.cn/news/232083.html

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

相关文章

脚本格式问题记录

服务器上的一些脚本迁移到其他服务上发生的小问题 问题&#xff1a;执行一个在win10系统编写好的shell脚本&#xff0c;放到Linux上执行报错如下&#xff1a; bash: ./xxx.sh: /bin/bash^M: bad interpreter: No such file or directory 原因&#xff1a;window系统写的脚本&a…

【计算机网络笔记】交换机

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

Web安全漏洞分析-XSS(中)

随着互联网的迅猛发展&#xff0c;Web应用的普及程度也愈发广泛。然而&#xff0c;随之而来的是各种安全威胁的不断涌现&#xff0c;其中最为常见而危险的之一就是跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;简称XSS&#xff09;。XSS攻击一直以来都是Web安全领…

Condition 源码解析

Condition 源码解析 文章目录 Condition 源码解析一、Condition二、Condition 源码解读2.1. lock.newCondition() 获取 Condition 对象2.2. condition.await() 阻塞过程2.3. condition.signal() 唤醒过程2.4. condition.await() 被唤醒后 三、总结 一、Condition 在并发情况下…

『亚马逊云科技产品测评』活动征文| 基于etcd实现服务发现

提示&#xff1a;授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 背景 etcd 是一个分布式 Key-Value 存储系统&#xff0…

Android修行手册 - 一篇文章从0到1搞一个Android Studio插件。

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

Spine深入学习 —— 换装

Spine深入学习————换装 数据对象和实例对象的关系与区别 数据对象是无状态的&#xff0c;可在任意数量的骨架实例间共用。有对应实例数据的数据对象类名称以“Data”结尾&#xff0c;没有对应实例数据的数据对象则没有后缀&#xff0c;如附件、皮肤及动画。 实例对象有许…

大数据Hadoop-HDFS_元数据持久化

大数据Hadoop-HDFS_元数据持久化 &#xff08;1&#xff09;在HDFS第一次格式化后&#xff0c;NameNode&#xff08;即图中的主NameNode&#xff09;就会生成fsimage和editslog两个文件&#xff1b; &#xff08;2&#xff09;备用NameNode&#xff08;即图中的备NameNode&…

什么是供应链攻击?

随着企业越来越依赖技术、连接性和第三方&#xff0c;供应链攻击变得越来越普遍。这些攻击旨在通过供应商和业务合作伙伴损害公司。 供应链攻击可能对企业和组织构成重大威胁&#xff0c;损害其安全以及向客户提供的产品和服务的安全。 在本文中&#xff0c;我们将探讨供应链…

java学习part23异常try catch

124-异常处理-异常的概述与常见异常的举例_哔哩哔哩_bilibili 1.异常 2.try catch 3.finally 类似golang的defer 一定执行的语句

数据结构 -- 图论之最小生成树

目录 1.最小生成树算法 1.Kruskal算法 2.Prim算法 1.最小生成树算法 定义:最小生成树算法:连通图有n个顶点组成,那么此时的图的每一个点都能相互连接并且边的个数为n-1条,那么此时该图就是最小生成树. 下面量算法有几个共同的特点: 1.只能使用图中权值最小的边来构造生成树 …

Javaweb之Vue组件库Element案例的详细解析

4.4 案例 4.4.1 案例需求 参考 资料/页面原型/tlias智能学习辅助系统/首页.html 文件&#xff0c;浏览器打开&#xff0c;点击页面中的左侧栏的员工管理&#xff0c;如下所示&#xff1a; 需求说明&#xff1a; 制作类似格式的页面 即上面是标题&#xff0c;左侧栏是导航&…