当前位置: 首页 > news >正文

数据结构学习笔记-图

1.图的存储

(1)邻接矩阵法

#define MaxVertexNum 100    //顶点数目的最大值
typedef struct{char Vex[MaxVertexNum];    //顶点表int Edge[MaxVertexNum][MaxVertexNum];    //邻接矩阵表,边表int vexnum,arcnum;    //图的当前顶点数和边数/弧数
} MGraph;

存储带权的图(网)

#define MaxVertexNum 100    //顶点数目的最大值
#define INFINITY 最大的int值    //宏定义常量“无穷”
typedef char VertexType;    //顶点的数据类型
typedef int EdgeType;    //带权图中边上权值的数据类型
typedef struct{VertexType Vex[MaxVertexNum];    //顶点EdgeType Edge[MaxVertexNum][MaxVertexNum];    //边的权int vexnum,arcnum;    //图的当前顶点数和弧数
}MGraph;

(2)邻接表法(顺序+链式存储)

//“顶点”
typedef struct VNode{VertexType data;    //顶点信息ArcNode *first;    //第一条边/弧
} VNode,AdList[MaxVertexNum];//用邻接表存储的图
typedef struct {AdList vertice;int vexnum,arcnum;
} ALGraph;//“边/弧”
typedef struct ArcNode{int adjvex;    //边/弧指向哪个结点struct ArcNode *next;    //指向下一条弧的指针//InfoType into;    //边权值
}ArcNode;

无向图的同一条边会指向两次,有向图的一条边只指向一次。

2.图的基本操作

Adjacent(G,x,y):判断图G是否存在边<x,y>或(x,y)。

Neighbors(G,x):列出图G中与结点x邻接的边。

InsertVertex(G,x):在图G中插入顶点x。

DeleteVertex(G,x):从图G中删除顶点x。

AddEdge(G,x,y):若无向边(x,y) 或有向边<x,y>不存在,则向图G中添加该边。

RemoveEdge(G,x,y):若无向边(x,y)或有向边<x,y>存在,则从图G中删除该边。

FirstNeighbor(G,x):求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1。

NextNeighbor(G,x,y):假设图G中顶点y是顶点x的第一个邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1。

Get_edge_value(G,x,y):获取图G中边(x,y)或<x,y>对应的权值。

Set_edge_value(G,x,y,v):设置图G中边(x,y)或<x,y>对应的权值为v。

3.图的广度优先遍历(BFS)

要点:

①找到与一个顶点相邻的所有顶点

②标记哪些顶点被访问过

③需要一个辅助队列

bool visited[MAX_VERTEX_NUM];    //访问标记数组void BFSTraverse(Graph G){    //对图G进行广度优先遍历for(i=0;i<G.vexnum;++i)visited[i]=FALSE;    //访问标记数组初始化InitQueue(Q);    //初始化辅助队列Q for(i=0;i<G.vexnum;++i)    //从0号顶点开始遍历if(!visited[i])    //对每个联通分量调用一次BFSBFS(G,i);    //vi未访问过,从vi开始BFS
}//广度优先遍历
void BFS(Graph G,int v){    //从顶点v出发,广度优先遍历图Gvisit(v);    //访问初始顶点vvisited[v]=TRUE;    //对v做已访问标记Enqueue(Q,v);    //顶点v入队列Qwhile(!isEmpty(Q)){DeQueue(Q,v);    //顶点v出队列Qfor(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))//检测v所有邻接点if(!visited[w]){    //w为v的尚未访问的邻接顶点visit(w);    //访问顶点wvisited[w]=TRUE;    //对w做已访问标记EnQueue(Q,w);    //顶点w入队列}    //if}    //while
}

 4.图的深度优先遍历

bool visited[MAX_VERTEX_NUM];    //访问标记数组void DESTraverse(Graph G){    //对图G进行深度优先遍历for(v=0;v<G.vexnum;++v)visited[v]=FALSE;    //初始化已访问标记数据for(v=0;v<G.vexnum;++v)    //本代码中是从v=0开始遍历if(!visited[v])DFS(G,v);
}void DFS(Graph G,int v){    //从顶点v出发,深度优先遍历图Gvisit(v);    //访问顶点vvisited[v]=TRUE;    //设已访问标记for(w=FirstNeighbor(G,v);w>0;w=NextNeighbor(G,v,w))if(!visited[w]){    //w为u的尚未访问的邻接顶点DFS(G,w);}    //if
}

5.最短路径(BFS算法)

//求顶点u到其他顶点的最短路径
void BFS_MIN_Distance(Graph G,int u){//d[i]表示从u到i结点的最短路径for(i=0;i<G.vexnum;++i){d[i]=∞;    //初始化路径长度path[i]=-1;    //最短路径从哪个顶点过来}d[u]=0;visited[u]=TRUE;EnQueue(Q,u);while(!isEmpty(Q)){    //BFS算法主过程DeQueue(Q,u);    //队头元素u出队for(w=FirstNeighbor(G,u);w>=0;w=NextNeighbor(G,u,w))if(!visited[w]){    //w为u的尚未访问的邻接顶点d[w]=d[u]+1;    //路径长度加1path[w]=u;    //最短路径应从u到wvisited[w]=TRUE;    //设已访问标记EnQueue(Q,w);    //顶点w入队}    //if}    //while
}

相关文章:

数据结构学习笔记-图

1.图的存储 &#xff08;1&#xff09;邻接矩阵法 #define MaxVertexNum 100 //顶点数目的最大值 typedef struct{char Vex[MaxVertexNum]; //顶点表int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵表&#xff0c;边表int vexnum,arcnum; //图的当前顶点数和边…...

【归并排序】| 详解归并排序核心代码之合并两个有序数组 力扣88

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;动态规划 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/merge-sorted-array/description/ 本道题是归并排序的…...

51单片机STC89C52RC——2.3 两个独立按键模拟控制LED流水灯方向

目的 按下K1键LED流水向左移动 按下K2键LED流水向右移动 一&#xff0c;STC单片机模块 二&#xff0c;独立按键 2.1 独立按键位置 2.2 独立按键电路图 这里要注意一个设计的bug P3_1 引脚对应是K1 P3_0 引脚对应是K2 要实现按一下点亮、再按一下熄灭&#xff0c;我们就需…...

Neo4j连接

终端输入&#xff1a; neo4j console 浏览器访问&#xff1a;http://localhost:7474/ 输入用户名和密码&#xff1a;neo4j&#xff0c; 梦想密码&#xff08;首次neo4j&#xff09; 代码连接用新的服务器地址&#xff1a; g Graph(neo4j://localhost:7687, auth(neo4j, ))…...

List 列表

文章目录 一、什么是 List 列表1.1 创建 List 列表的方式1.2 列表的新增函数方法1.3 列表的删除函数方法1.4 修改列表数据的方法1.5 列表的查询函数方法1.6 列表的排序和反序1.7 列表的复制 一、什么是 List 列表 List 列表&#xff1a;该数据类型定义的变量可以理解为是一个数…...

nginx ws长连接配置

nginx ws长连接配置 http根节点下配上 map $http_upgrade $connection_upgrade {default upgrade; close;}如下&#xff1a; server服务节点下&#xff0c;后端接口的代理配置 proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connec…...

Windows下访问wsl的数据

Windows下访问wsl的数据 有些人感受到的是雨&#xff0c;而很多人感受到的只有淋湿。 Windows下的wsl说实话还是挺不错的&#xff0c;对于开发而言&#xff0c;效果相当的可以。 比如在某个文件夹&#xff0c;Windows编辑好代码后&#xff0c;直接右键打开wsl&#xff0c;就可…...

机器学习笔记 - 用于3D数据分类、分割的Point Net简述

一、简述 在本文中,我们将了解Point Net,目前,处理图像数据的方法有很多。从传统的计算机视觉方法到使用卷积神经网络到Transformer方法,几乎任何 2D 图像应用都会有某种现有的方法。然而,当涉及到 3D 数据时,现成的工具和方法并不那么丰富。3D 空间中一个工具就是Point …...

vscode 连接 GitHub

目录 vscode连接github一、解决 github 登录问题二、通过 SSH 连接 github1、只有一个 git 账号2、切换 git 账号3、在两个账号之间切换 vscode 连接 gitee一、通过 HTTPS 连接二、通过 SSH 连接 vscode连接github 在 vscode 中首次使用 git push 命令时会要求输入 github 账户…...

集合java

1.集合 ArrayList 集合和数组的优势对比&#xff1a; 长度可变 添加数据的时候不需要考虑索引&#xff0c;默认将数据添加到末尾 package com.itheima;import java.util.ArrayList;/*public boolean add(要添加的元素) | 将指定的元素追加到此集合的末尾 | | p…...

智能体(Agent)实战——从gpts到auto gen

一.GPTs 智能体以大模型作为大脑&#xff0c;同时配备技能&#xff0c;使其能够完成具体的任务。同时&#xff0c;为了应用于垂直领域&#xff0c;我们需要为大模型定义一个角色&#xff0c;并构建知识库。最后&#xff0c;定义完整的流程&#xff0c;使其完成整个任务。以组会…...

PyTorch 张量数据类型

【数据类型】Python 与 PyTorch 常见数据类型对应&#xff1a; 用 a.type() 获取数据类型&#xff0c;用 isinstance(a, 目标类型) 进行类型合法化检测 >>> import torch >>> a torch.randn(2,3) >>> a tensor([[-1.7818, -0.2472, -2.0684],[ 0.…...

奇思妙想-可以通过图片闻见味道的设计

奇思妙想-可以通过图片闻见味道的设计 偷闲半日享清闲&#xff0c;炭火烧烤乐无边。肉串飘香引客至&#xff0c;笑语欢声绕云间。人生难得几回醉&#xff0c;且把烦恼抛九天。今宵共饮开怀酒&#xff0c;改日再战新篇章。周四的傍晚&#xff0c;难得的闲暇时光让我与几位挚友相…...

装饰者模式(设计模式)

装饰模式就是对一个类进行装饰&#xff0c;增强其方法行为&#xff0c;在装饰模式中&#xff0c;作为原来的这个类使用者还不应该感受到装饰前与装饰后有什么不同&#xff0c;否则就破坏了原有类的结构了&#xff0c;所以装饰器模式要做到对被装饰类的使用者透明&#xff0c;这…...

ADB调试命令大全

目录 前言命令大全1.显示当前运行的全部模拟器&#xff1a;adb devices2.启动ADB: adb start-server3.停止ADB: adb kill-server4.安装应用程序&#xff1a; adb install -r [apk文件]5.卸载应用程序&#xff1a; adb uninstall [packagename]6.将手机设备中的文件copy到本地计…...

查看npm版本异常,更新nvm版本解决问题

首先说说遇见的问题&#xff0c;基本上把nvm&#xff0c;npm的坑都排了一遍 nvm版本导致npm install报错 Unexpected token ‘.‘install和查看node版本都正确&#xff0c;结果查看npm版本时候报错 首先就是降低node版本… 可以说基本没用&#xff0c;如果要降低版本的话&…...

计算机行业

计算机行业环境分析 2022.01.12 计算机行业环境分析 计算机专业就业前景 随着科技的进步和信息事业的发展&#xff0c;尤其是计算机技术的发展与网络应用的逐渐普及。计算机已成为人们工作和生活中不可缺少的东西。IT行业迅猛发展&#xff0c;就业工作岗位也比比皆是。在最近…...

各种机器学习算法的应用场景分别是什么(比如朴素贝叶斯、决策树、K 近邻、SVM、逻辑回归最大熵模型)?

2023简直被人工智能相关话题席卷的一年。关于机器学习算法的热度&#xff0c;也再次飙升&#xff0c;网络上一些分享已经比较老了。那么今天借着查询和学习的机会&#xff0c;我也来浅浅分享下目前各种机器学习算法及其应用场景。 为了方便非专业的朋友阅读&#xff0c;我会从算…...

SQLite JDBC驱动程序

SQLite JDBC驱动程序下载地址&#xff1a; 下载地址...

Postgre 调优工具pgBadger部署

一&#xff0c;简介&#xff1a; pgBadger&#xff08;日志分析器&#xff09;类似于oracle的AWR报告&#xff08;基于1小时&#xff0c;一天&#xff0c;一周&#xff0c;一月的报告&#xff09;&#xff0c;以图形化的方式帮助DBA更方便的找到隐含问题。 pgbadger是为了提高…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...