408代码类复习--图类

图类

Author:Joanh_Lan

Personal Blog Links:Joanh_LanのCSDN博客
备注:

个人复习版本

不保证完全正确,理性参考(不背锅i哦)

(:(:(:

欢迎阅读!!!
如果需要电子版请私信我,这个专栏不收取任何费用。

邻接矩阵

#define MaxVertexNum 100	//顶点数目的最大值
typedef char VertexType;	//顶点对应的数据类型 
typedef int EdgeType;	//边所对应的数据类型
typedef struct {VertexType vex[MaxVertexNum];	//顶点表 EdgeType edge[MaxVertexNum][MaxVertexNum];	//邻接矩阵int vexnum, arcnum;	//图的当前顶点数&边数
} MGraph;

邻接表

#define MaxVertexNum 100 //图中顶点数目的最大值 
typedef struct ArcNode	//边表结点
{int adjvex;	//该弧所指向的顶点位置struct ArcNode *nextarc;	//指向下一条弧的指针
} ArcNode;
typedef struct VNode	//顶点表结点
{int data;	//顶点信息ArcNode *firstarc;	//指向第一条依附顶点的弧指针
} VNode, AdjList[MaxVertexNum];
typedef struct
{AdjList vertices;	//邻接表int vexnum, arcnum;	//图的顶点数 & 弧边数
}	ALGraph;	//ALGraph是以邻接表存图的图类型

十字链表

在这里插入图片描述

邻接多重表

邻接多重表是无向图的一种链式存储结构。在邻接表中,容易求得顶点和边的各种信息,但在邻接表中求两个顶点之间是否存在边而对边执行删除等操作时,需要分别在两个顶点的边表中遍历,效率较低。与十字链表类似,在邻接多重表中,每条边用一个结点表示,其结构如下所示。
在这里插入图片描述

在这里插入图片描述

-参考:2025王道数据结构-

图的遍历(搜索)

BFS

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

DFS

//树的先根遍历
void PreOrder(TreeNode *R)
{if(R != NULL){visit(R);   //访问根节点while(R还有下一个子树T)PreOrder(T);//先根遍历下一棵子树}
}

如果是连通图:

bool visited [MAX_VERTEX_NUM];   //访问标记数组
void DFS(Graph G, int v) //从顶点v出发,深度优先遍历图
{visit(v);//访问顶点visited[v] = TRUE; //设已访问标记{for(w = FirstNeighbor(G, v); w >= 0; w = NextNeighor(G, v, w))if(!visited[w]) //w为u的尚未访问的邻接顶点DFS(G, w);}
}

如果是非连通图(注意:这里可能出坑)

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

时间复杂度=访问各结点所需时间+探索各条边所需时间

邻接矩阵 \color{red}邻接矩阵 邻接矩阵存储的图:
访问 |V| 个顶点需要O(|V|)的时间
查找每个顶点的邻接点都需要O(|V|)的时间,⽽总共有|V|个顶点
时间复杂度= O ( ∣ V ∣ 2 ) \color{red}O(|V|^2) O(V2)

邻接表 \color{red}邻接表 邻接表存储的图:
访问 |V| 个顶点需要O(|V|)的时间
查找各个顶点的邻接点共需要O(|E|)的时间,
时间复杂度= O ( ∣ V ∣ + ∣ E ∣ ) \color{red}O(|V|+|E|) O(V+E)

注:
同⼀个图的 邻接矩阵 \color{red}邻接矩阵 邻接矩阵表示⽅式 唯⼀ \color{red}唯⼀ ,因此 深度优先遍历序列唯⼀ \color{red}深度优先遍历序列唯⼀ 深度优先遍历序列唯
同⼀个图 邻接表 \color{red}邻接表 邻接表表示⽅式 不唯⼀ \color{red}不唯⼀ 不唯,因此 深度优先遍历序列不唯⼀ \color{red}深度优先遍历序列不唯⼀ 深度优先遍历序列不唯

最小生成树

prim

#define MaxVertexNum 100	//顶点数目的最大值
typedef char VertexType;	//顶点对应的数据类型 
typedef int EdgeType;	//边所对应的数据类型
typedef struct {VertexType vex[MaxVertexNum];	//顶点表 EdgeType edge[MaxVertexNum][MaxVertexNum];	//邻接矩阵int vexnum, arcnum;	//图的当前顶点数&边数
} MGraph;int dist[MaxVertexNum];	// 存储其他点到当前最小生成树的距离
bool st[MaxVertexNum];	//存储每个点是否已经在生成树中
int prim(MGraph G) //返回最小生成树的权值
{for (int i = 0; i < MaxVertexNum; i++)	dist[i] = 0x3f3f3f3f;int ans = 0;for (int i = 0; i < MaxVertexNum; i++){int t = -1;for (int j = 0; j < MaxVertexNum; j++)if (!st[j] && (t == -1 || dist[t] > dist[j]))	t = j;if (i && dist[t] == 0x3f3f3f3f)	return 0x3f3f3f3f; //不连通if (i)	ans += dist[t];st[t] = true;for (int j = 0; j < MaxVertexNum; j++)dist[j] = min(dist[j], G.edge[t][j]);}return ans;
}

Kruskal

如果代码题真考到

按照题目给的图的定义,写个合适的sort替换下面的即可

这里只提供框架

int n, m;       // n是点数,m是边数
int p[N];       // 并查集的父节点数组struct Edge     // 存储边
{int a, b, w;bool operator< (const Edge &W)const{return w < W.w;}
}edges[M];int find(int x)     // 并查集核心操作
{if (p[x] != x) p[x] = find(p[x]);return p[x];
}int kruskal()
{sort(edges, edges + m);for (int i = 1; i <= n; i ++ ) p[i] = i;    // 初始化并查集int res = 0, cnt = 0;for (int i = 0; i < m; i ++ ){int a = edges[i].a, b = edges[i].b, w = edges[i].w;a = find(a), b = find(b);if (a != b)     // 如果两个连通块不连通,则将这两个连通块合并{p[a] = b;res += w;cnt ++ ;}}if (cnt < n - 1) return INF; //不连通return res;
}

dijkstra

时间复杂是 O( n 2 + m n^2+m n2+m), n 表示点数,m 表示边数

#define MaxVertexNum 100	//顶点数目的最大值
typedef char VertexType;	//顶点对应的数据类型 
typedef int EdgeType;	//边所对应的数据类型
typedef struct {VertexType vex[MaxVertexNum];	//顶点表 EdgeType edge[MaxVertexNum][MaxVertexNum];	//邻接矩阵int vexnum, arcnum;	//图的当前顶点数&边数
} MGraph;int dist[MaxVertexNum]; // 存储1号点到每个点的最短距离
bool st[MaxVertexNum];  // 存储每个点的最短路是否已经确定int dijkstra(MGraph G, int p, int k)	// p号点到k号点的最短路径,如果不存在返回-1
{for (int i = 0; i < MaxVertexNum; i++)	dist[i] = 0x3f3f3f3f3;dist[p] = 0;for (int i = 0; i < MaxVertexNum; i++){int t = -1;	//在还未确定最短路的点中,寻找距离最小的点for (int j = 0; j < MaxVertexNum; j++)if (!st[j] && (t == -1 || dist[t] > dist[j]))	t = j;//用t更新其他点的距离for (int j = 0; j < MaxVertexNum; j++)dist[j] = min(dist[j], dist[t] + G.edge[t][j]);st[t] = true;}if (dist[k] == 0x3f3f3f3f)	return -1;return dist[k];
}

floyd

时间复杂度:O( n 3 n^3 n3)

void floyd()
{for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++){dist[i][j] = map[i][j],//path[i][j] = 0;  }for(int k = 1; k <= n; k++)for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)if(dist[i][k] + dist[k][j] < dist[i][j]){dist[i][j] = dist[i][k] + dist[k][j];//path[i][j] = k;  // path记录路径中的最大点}}

拓扑排序

请参考我之前的文章(点击即可转跳)

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

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

相关文章

Maven的安装——给Idea配置Maven

一、什么是Maven? Maven是一个开源的项目管理工具&#xff0c;它主要用于Java项目的构建、依赖管理和项目生命周期管理。 二、准备环境 maven安装之前&#xff0c;我们要先安装jdk&#xff0c;确保你已经安装了jdk环境。可以通过【win】【r】打开任务管理器&#xff0c;输入…

深入解析自适应控制算法及python实现

目录 深入解析自适应控制算法第一部分:自适应控制算法简介1.1 什么是自适应控制1.2 自适应控制的核心思想1.3 常见类型1.4 自适应控制的优缺点第二部分:自适应控制算法的数学基础2.1 动态系统建模2.2 自适应律设计2.3 稳定性分析第三部分:Python 实现自适应控制算法的框架第…

linux 常用命令指南(存储分区、存储挂载、docker迁移)

前言&#xff1a;由于目前机器存储空间不够&#xff0c;所以‘斥巨资’加了一块2T的机械硬盘&#xff0c;下面是对linux扩容的一系列操作&#xff0c;包含了磁盘空间的创建、删除&#xff1b;存储挂载&#xff1b;docker迁移&#xff1b;anaconda3迁移等。 一、存储分区 1.1 …

OpenCvSharp Demo 饱和度、明度、对比度、锐化、阴影、高光、色温实现滤镜效果

目录 效果 风景-天空滤镜 人像—酷感冷艳滤镜 美食—鲜美滤镜 美食—巧克力滤镜 项目 代码 参考 下载 效果 风景-天空滤镜 人像—酷感冷艳滤镜 美食—鲜美滤镜 美食—巧克力滤镜 项目 代码 using OpenCvSharp; using System; using System.Diagnostics; using Syst…

高级网络安全——SSL/TLS, HTTPS, VPN(week4)

文章目录 一、前言二、重点概念1. 安全外壳(SSH)2. SSH概述3. SSH-2的安全目标4. SSH传输层协议5. SSH密钥指纹6. SSH密钥指纹7. SSH-2算法SSH传输层协议8. SSH传输层协议Diffie-Hellman密钥交换9. SSH传输层协议Diffie-Hellman密钥交换10. SSH传输层协议Diffie-Hellman密钥交…

springBoot整合 Tess4J实现OCR识别文字(图片+PDF)

1. 环境准备 JDK 8 或更高版本Maven 3.6 或更高版本Spring Boot 2.4 或更高版本Tesseract OCR 引擎Tess4J 库 2. 安装 Tesseract OCR 引擎 下载地址&#xff1a; Home UB-Mannheim/tesseract Wiki GitHub linux直接安装&#xff1a;sudo apt-get install tesseract-ocr 3.…

Cocos creator 3.8 一些事件的使用,加载预制体的两种方式 5

没搞懂rotation与angle&#xff0c;rotation既然是个四元素&#xff0c;可面板上的是什么Vec3的方式显示&#xff0c;而且发现旋转节点&#xff0c;哪怕单独的旋转y轴&#xff0c;有时候三个值也会发生变化&#xff0c;猜测可能引擎内部是按照一定的规则&#xff0c;来表示这个…

如何在react中使用 indexDb

下载依赖 npm install localforage 接下来像使用 localstore一样使用它 import React, { useEffect } from react; import localForage from localforage;const App () > {useEffect(() > {// 保存数据async function storeData() {try {await localForage.setItem(us…

Easyexcel(4-模板文件)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09; 文件导出 获取 resources 目录下的文件&#xff0c;使用 withTemplate 获…

迁移学习理论与应用

迁移学习&#xff08;Transfer Learning&#xff09;是一种机器学习技术&#xff0c;旨在将一个任务&#xff08;源任务&#xff09;上学到的知识迁移到另一个相关但不完全相同的任务&#xff08;目标任务&#xff09;上&#xff0c;从而提高目标任务的学习效果。这种方法的核心…

近期两篇NeRF/3DGS-based SLAM方案赏析:TS-SLAM and MBA-SLAM

原文链接&#xff1a;近期两篇NeRF/3DGS-based SLAM方案赏析&#xff1a;TS-SLAM and MBA-SLAM paper1&#xff1a;TS-SLAM: 基于轨迹平滑约束优化的神经辐射场SLAM方法 导读 本文提出了TS-SLAM&#xff0c;一种改进的基于神经辐射场&#xff08;NeRF&#xff09;的SLAM方法…

游戏引擎学习第20天

视频参考:https://www.bilibili.com/video/BV1VkBCYmExt 解释 off-by-one 错误 从演讲者的视角&#xff1a;对代码问题的剖析与修复过程 问题的起因 演讲者提到&#xff0c;他可能无意中在代码中造成了一个错误&#xff0c;这与“调试时间标记索引”有关。他发现了一个逻辑问题…

《鸿蒙系统:开启智能新时代的璀璨之星》

一、鸿蒙系统&#xff1a;崛起之路 鸿蒙系统的发展历程堪称一部科技创新的传奇。2012 年&#xff0c;华为前瞻性地启动鸿蒙系统研发项目&#xff0c;彼时或许很少有人能预见到它未来的辉煌。2019 年&#xff0c;鸿蒙系统首个开发者预览版的发布&#xff0c;如同夜空中的一颗璀…

Vue Router 4 中的createWebHistory 显示不出重定向后的网页内容和 createWebHashHistory的区别

Vue Router 4 是 Vue.js 3 的官方路由库&#xff0c;它提供了多种方式来创建路由实例。createWebHistory 和 createWebHashHistory 都是 Vue Router 4 中用于创建历史记录管理器的方法。 1. createWebHistory 用途&#xff1a;使用浏览器的 HTML5 History API 来管理路由。UR…

SQL注入--DNSlog外带注入--理论

什么是DNSlog? DNS的作用是将域名解析为IP 而DNSlog就是存储在DNS服务器上的域名信息&#xff0c;它记录着用户对域名访问信息。可以理解为DNS服务器上的日志文件。 多级域名 比如blog.csdn.net&#xff0c;以点为分隔&#xff0c;从右向左依次是顶级域名、二级域名、三级域…

#Verilog HDL# Verilog中的ifdef/ifndef/else等用法

目录 示例1: 示例2: 示例3: 示例4: 通过示例讲解,`ifdef/`ifndef/`elsif/`else/`endif 的用法 示例1: // Style #1: Only single `ifdef `ifdef <FLAG>// Statements `endif// Style #2: `ifdef with `else part `ifdef <FLAG>// Statements `else// Sta…

Intelli下载Gradle返回Connect Time Out

文章目录 问题解决参考 问题 打开intelliJ项目后&#xff0c;下载Gradle时返回Connect Time Out, 需要对gradle wrapper进行配置。 解决 我的IntelliJthsg版本&#xff1a; IntelliJ IDEA 2023.2.4 (Community Edition) Build #IC-232.10203.10, built on October 25, 2023…

python: Serialize and Deserialize complex JSON using jsonpickle

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎 # Serialize and Deserialize complex JSON in Python # 描述&#xff1a;pip install jsonpickle https://github.com/jsonpi…

软件测试面试之重要的名词解释

1、测试(testing) 包括了所有生命周期活动的过程&#xff0c;包括静态的和动态的。涉及计划、准备和对软件产品及其相关工作产品的评估&#xff0c;用以确定它们是否满足了需求&#xff0c;证明它们是否符合了目标&#xff0c;以及是否发现了缺陷。 2.计算机软件的测试目的是 …

基于图的去中心化社会推荐过滤器

目录 原论文研究背景与研究意义概述论文所提出算法的主要贡献GDSRec算法原理与流程问题定义去中心化图&#xff08;decentralized graph&#xff09;所提出方法(三种并行建模)用户建模&#xff08;user modelling&#xff09; 模版代码讲解main.py顶层文件&#xff1a;用于集成…