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));//初始化所有结点的前一个节点为 -1
	dist[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 -1

int 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));    //初始化所有结点的前一个节点为-1
    dist[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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ的Web管理页面

访问页面 http://IP:15672/账号密码默认都是&#xff1a;guest 主页概览 Overview 显示当前RabbitMQ Broker的运行信息、连接信息、集群信息以及配置信息等。 连接 Connections 无论生产者还是消费者&#xff0c;都需要与RabbitMQ建立连接后才可以完成消息的生产和消费&#…

PHP:js中怎么使用PHP变量,php变量为数组时的处理

方法一&#xff1a;使用内嵌 PHP 脚本标记 1、简单的拼接 使用内嵌的 PHP 脚本标记 <?php ?> 将 PHP 变量 $phpVariable 的值嵌入到 JavaScript 代码中。 <?php $phpVariable "Hello, World!"; ?><script> // 将 PHP 变量的值传递给 JavaS…

mac安装homebrew/brew遇到443

文章目录 问题描述解决方法方法一方法二 参考文献 问题描述 brew 全称Homebrew 是Mac OSX上的软件包管理工具 想在mac终端安装&#xff0c;运行网上提供的指令 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)&quo…

【Springboot系列】SpringBoot整合Jpa

文章目录 前言&#xff1a;什么是JPA&#xff1f;JPA优缺点优点1.简化开发&#xff1a;2.高度抽象&#xff1a;3.跨数据库支持&#xff1a;4.自动化的事务管理&#xff1a; 缺点1.学习成本较高&#xff1a;2.性能问题&#xff1a;3.灵活性受限&#xff1a; 示例版本依赖代码Use…

Ubuntu安装nfs服务步骤

Ubuntu安装nfs服务步骤 一、NFS&#xff1f; NFS&#xff1a;网络文件系统&#xff08;Network File system File&#xff09;缩写&#xff0c;可通过网络让不同的机器&#xff0c;不同操作系统之间可以彼此共享文件和目录。 二、安装 1.安装nfs服务器命令&#xff1a;sudo…

原神:夏洛蒂是否值得培养?全队瞬抬治疗量不输五星,但缺点也很明显

作为四星冰系治疗角色&#xff0c;夏洛蒂的实战表现可以说相当让人惊喜。不仅有相当有意思的普攻动作以及技能特效&#xff0c;而且她还有治疗和挂冰等功能性。下面就来详细聊聊夏洛蒂是否值得培养。 【治疗量让人惊喜&#xff0c;但也有缺点】 说实话&#xff0c;在使用夏洛蒂…

智能手表上的音频(四):语音通话

上篇讲了智能手表上音频文件播放。本篇开始讲语音通话。同音频播放一样有两种case&#xff1a;内置codec和BT。先看这两种case下audio data path&#xff0c;分别如下图&#xff1a; 内置codec下的语音通话audio data path 蓝牙下的语音通话audio data path 从上面两张图可以看…

【Lustre相关】应用部署-03-Lustre集群部署实践(软raid方案)

文章目录 一、前言1、硬件配置2、组网拓扑3、总体方案 二、软件安装三、集群部署1、配置多路径2、配置高可用集群3、配置zpool4、部署lustre5、配置Lustre角色高可用6、配置Lustre状态监控6.1、Lustre网络状态监控6.2、Lustre集群状态监控6.3、配置优化6.3.1、设置故障恢复不回…

springboot整合easy-es实现数据的增删改查

背景 目前公司的一个老项目&#xff0c;查询贼慢&#xff0c;需要想办法提升一下速度&#xff0c;于是就想到了ES&#xff0c;现在尝试一下将ES整合到项目中来提升检索效率。 ES是基于倒排索引实现的&#xff0c;倒排索引中一个表相当于一个索引&#xff0c;表中的每条记录都…

飞翔的小鸟——Java

一、创建文件、包、类、插入图片文件 二、app包 1、Gameapp类&#xff08;运行游戏&#xff09; package app;import main.GameFrame;public class Gameapp {public static void main(String[] args) {//游戏的入口new GameFrame();} } 三、main包 1、Barrier&#xff08…

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

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

【Excel】WPS快速按行筛选过滤

用的筛选都是进行列数据过滤&#xff0c;那么遇到一个情况需要行数据过滤查看数据 行过滤 选中行&#xff0c;然后右键菜单&#xff0c;行筛选。 列过滤

iOS NSDate的常用API

目录 一、创建日期 1.获取当前时间 2.当前时间指定秒数之后/前的时间 3.指定日期之后/后的时间 4.2001年之后/前指定秒数的时间 5.1970年之后/后指定秒数的时间 二、初始化日期 1.init 2.时间间指定秒数的时间 3.指定时间指定秒数之前/后的时间 4.2001年指定秒数之后…

【ZEDSLAM】Ubuntu18.04系统ZED 2i双目相机SDK安装、联合标定、SLAM测试

0.设备、环境和说明 笔记本电脑i5-8300H、GTX 1060、32GRAM 因为后面要测试Vins-Fusion和ORB-SLAM3&#xff0c;所以推荐安装Ubuntu 18.04&#xff08;或者Ubuntu 20.04&#xff09; ROS 1&#xff08;不建议用比Ubuntu18更低的版本&#xff09; ROS一键安装命令&#xff1a;…

【图论】重庆大学图论与应用课程期末复习资料(私人复习资料)

考试章节范围 第一章&#xff1a;1.1、1.2、1.3 填空 顶点集和边集都有限的图&#xff0c;称为有限图只有一个顶点的图&#xff0c;称为平凡图边集为空的图&#xff0c;称为空图顶点数为n的图&#xff0c;称为n阶图连接两个相同顶点的边的条数称为边的重数&#xff1b;重数大…

Jenkins 如何查看已经记录登录服务器的凭证密码

文章目录 一、背景描述二、解决方案一&#xff08;查看所有账号密码&#xff09;三、解决方案二&#xff08;查询指定账号密码&#xff09; 一、背景描述 在日常的开发过程中&#xff0c;有时候会出现忘记开发、测试服务器的登录密码的情况。此时恰巧 Jenkins 上记录了登录该主…

Java多线程核心技术一-多线程基础其他内容

接上篇&#xff1a; Java多线程核心技术一-基础篇synchronzied同步方法 Java多线程核心技术一-基础篇synchronzied同步语句块 1 String常量池特性与同步问题 JVM具有String常量池的功能&#xff0c;如下示例&#xff1a; public class Test01 {public static void main(Str…

【Apifox】token的使用方式和脚本示例

前言&#xff0c;关于token的使用&#xff0c;仅做了简单的demo测试token效果。 一、手动登录获取token 顾名思义&#xff0c;因为只有登录之后才有token的信息&#xff0c;所以在调用其他接口前需要拥有token才能访问。 操作步骤 1)添加环境变量、全局参数 这里拿测试环境举…

37 - 数据库参数设置优化,失之毫厘差之千里

MySQL 是一个灵活性比较强的数据库系统&#xff0c;提供了很多可配置参数&#xff0c;便于我们根据应用和服务器硬件来做定制化数据库服务。如果现在让你回想&#xff0c;你可能觉得在开发的过程中很少去调整 MySQL 的配置参数&#xff0c;但我今天想说的是我们很有必要去深入了…

SourceInsight - Relation Windows

磨刀不误砍柴工&#xff0c;你使用的工具决定了你的下限。我平时使用较多的代码编辑工具就是SourceInsight&#xff0c;这个工具速度快&#xff0c;操作方便&#xff0c;但处理非常大的项目的性能不是很理想&#xff0c;比如你要是添加整个Linux Kernel的源代码的话。 在使用SI…