【图论(1)】图的存储、遍历与拓扑排序

news2025/1/8 4:42:30

5月16-5月18日学习内容

文章目录

  • 一、图是什么
  • 二、图的存储
    • 1、直接存边法
    • 2、邻接矩阵法
    • 3、邻接表法
    • 4、链式前向星
    • 时间复杂度分析
  • 三、图的遍历
    • DFS
    • BFS
  • 四、拓扑排序(今天实在没时间写了,明天写)


一、图是什么

这是oi.wiki给的定义
请添加图片描述

简而言之,图就是一些所组成的数据结构。而图,也有很多分类,如一些图是连在一起的,称为连通图;另一些不联通的图呢,则称为非连通图。一些图标有方向,称为有向图;另一些图没有方向,称为无向图。而更复杂的图呢,带有权值,另一些图则没有权值。对于点来说,与他相连的边的个数称为它的度数,而在有向图中,一个点发出去的边的个数称为出度,反之为入度

二、图的存储

一般来说,图的存储分为4种形式:直接存边邻接矩阵邻接表链式前向星

1、直接存边法

这种方法呢,比较简单,没有用到队列、链表等数据结构。但是,正因为没有用到高级数据结构,时间复杂度就会很高。
直接存边法:每次输入u,v,直接将u,v存入数组a[][2]中。

forint i = 1; i <= m; i++){
	cin >> u >> v;
	a[i][1] = u, a[i][2] = v;
}

2、邻接矩阵法

这种方法是用一个布尔类型的二维数组实现的,是一种很常用的方法。
邻接矩阵法:若a[u][v]==1,说明u->v存在直接路径,反之,则不存在直接路径。

forint i = 1; i <= m; i++){
	cin >> u >> v;
	a[u][v] = 1;//有向图
	a[u][v] = a[v][u] = 1;//无向图

此方法只适用于稠密图,不适用于稀疏图。(空间复杂度大)

3、邻接表法

邻接表法:用一个二维vector来实现,i代表着从第i个位置出发,而若a[i][n]=p,则从i出发,有到p的直接路径。

for(int i = 1; i <= m; i++){
	cin >> u >> v;
	a[u].push_back(v);

4、链式前向星

本质上用链表实现的邻接表。

时间复杂度分析

直接存边邻接矩阵邻接表
O(m)O(1)O(d+(u))
O(m)O(m)O(d+(u))
O(nm)O(n*n)O(n+m)
O(m)O(n*n)O(m)

三、图的遍历

DFS

深度优先
从一个点开始,找到它的所有相邻点,在一次遍历相邻点,一个点遍历完后在遍历另一个相邻点

//直接存边
void dfs(int u){
	vis[i] = 1; 
	for(int i - 1; i <= m; i++){
		if(adj[i][1] == u && vis[adj[i][2]] == 0){
			dfs(adj[i][2]);
		}
	}
}
//邻接矩阵
void dfs(int u){
	vis[u] = 1;
	for(int i = 1; i <= n; i++){
		if(adj[u][i] == 1 && vis[i] == 0){
			dfs(i);
		}
	}
}
//邻接表
void dfs(int u){
	vis[u] = 1; 
	for(int i = 1; i <= adj[u].size(); i++){
		if(vis[adj[u][i]] == 0){
			dfs(adj[u][i]);
		}
	}
}
//链式前向星
void dfs(int u) {
  vis[u] = 1;
  for (int i = head[u]; i; i = e[i].x) {
    if (!vis[e[i].t]) {
      dfs(v);
    }
  }
}

BFS

广度优先
与深搜不同的是,广搜是把一个点的相邻点遍历了再遍历这些点的相邻点。也就是一层一层的,深搜则可以看做一列一列的。

//直接存边
void bfs(int u){
	while(!q.empty()) q.pop();
	q.push(u), vis[u] = 1; 
	while(!q.empty(){
		u = q.front();
		q.pop();
		for(int i = 1; i <= m; i++){
			if(adj[i][1] == u && vis[adj[i][2]] == 0){
				q.push(adj[i][2]);
				vis[adj[1][2]] = 1;
			}
		}
	}
}
//邻接矩阵
for(int i = 1; i <= m; i++){
	if(adj[i][1] == u && vis[i] == 0){
		q.push(i);
		vis[i] = 1;
	}
}
//邻接表
for(int i = 1; i <= m; i++){
	if(vis[adj[u][i] == 0){
		q.push(vis[adj[u][i]);
		vis[adj[u][i]] = 1;
	}
}
//链式前向星
void bfs(s) {
  q = new queue()
  q.push(s), visited[s] = true
  while (!q.empty()) {
    u = q.pop()
    for each edge(u, v) {
      if (!visited[v]) {
        q.push(v)
        visited[v] = true
      }
    }
  }
}

四、拓扑排序(今天实在没时间写了,明天写)

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

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

相关文章

ENVI制图——土地利用专题图

ENVI制图 0 前言1 数据准备2 数据预处理2.1 先在arcmap中把数据导出为tif格式&#xff0c;然后加入envi&#xff08;别问我为什么要先用arcmap处理&#xff0c;因为这是envi制图教程 :( &#xff09;2.2 直接把tif格式的数据拖进envi&#xff0c;此时看不到数据类别&#xff0c…

低代码+AI:助力企业数字化转型,揭示未来发展趋势

问个问题&#xff1a;你有没有亲自去了解、使用近期爆火的生成式人工智能——ChatGPT&#xff1f; 如果答案是否定的&#xff0c;作为企业数字化转型的前沿先锋小Z&#xff0c;建议你一定要去亲自尝试它。虽然人工智能技术已经发展多年&#xff0c;但OpenAI所发布的ChatGPT&…

瑞吉外卖 - 新增菜品功能(16)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

(十)Spring源码阅读:finishBeanFactoryInitialization方法

一、概述 该方法是实例化bean的主要方法&#xff0c;它实现的主要流程如下图所示。 这是方法执行的主要流程图。 具体执行流程如下图&#xff0c;我们将按照具体执行流程一个个介绍具体的方法。 二、主要方法 finishBeanFactoryInitialization内部调用了getBean方法。 getBea…

AIGC+机器人=具身智能?硅谷最酷的两个男人不谋而合预演“下个浪潮”

收集整理|小鱼新的AI题材层出不穷&#xff0c;这次轮到“机器人AI"融合而成的具身智能概念。 “硅谷钢铁侠"马斯克和热爱黑色皮衣的"显卡教父”黄仁勋均作出积极表态&#xff0c;可谓不谋而合。 当地时间5月16日&#xff0c;特斯拉2023年年度股东大会召开&…

unity DoTween动画插件的使用(最全)

DOTween是最常用的动画插件之一,比使用Unity自带脚本写动画,方便很多。 插件获取 untiy商店插件地址 https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676 DOTween商城地址,开发文档 http://dotween.demigiant.com 导入和设置 DOTween首次使…

离散数学_九章:关系 —— 拓扑排序

拓扑排序 背景知识相容一个引理什么是拓扑排序 拓扑排序算法&#xff08;伪代码&#xff09;几个实例例1例2 假设一个项目由20个不同的任务构成。某些任务只能在其他任务结束之后完成。如何找到关于这些任务的顺序&#xff1f; 为了对这个问题建模&#xff0c;我们在任务的集合…

mysql强制修改mysql数据库密码(无需原密码)

1.创建新记事本new_password.txt 定位到记事本绝对路径&#xff0c;我直接放桌面 C:\Users\bao123\Desktop 为用户为 root 新密码 123456为例 ALTER user rootlocalhost identified by 123456; 为用户为 mytest 新密码 88888888为例 ALTER user mytestlocalhost identifi…

opencv_c++学习(十三)

一、创建滑动条 createTrackbar(const String & trackbarname, const String & winname, int* value, int count, onChange , TrackbarCallback 0, void * userdata 0)trackbarname:滑动条的名称。 winname:创建滑动条窗口的名称。 value:指向整数变量的指针&#xff0…

Harbor在arm架构下亲测编译成功

先安装好Docker,docker-compose 华为云arm架构安装Docker arm架构安装docker-compose Harbor官网: https://github.com/goharbor/harbor/releases Harbor官方没有提供arm架构的包,需要自己编译,我编译好的版本是:harbor-1.9.1 大家可以按我的博客,自己去编译,或评论留言给…

Vivado 下 LED 流水灯实验

目录 Vivado 下 LED 流水灯实验 1、实验简介 2、实验环境 3、实验原理 3.1、LED硬件电路 3.2、程序设计 4、Vivado 工程 4.1、创建工程 4.2、编写流水灯的 verilog代码 1. 点击 Project Manager 下的 Add Sources 图标&#xff08;或者使用快捷键 AltA&#xff09;。…

基于协同过滤的推荐算法

基于协同过滤的推荐算法 基于协同过滤&#xff08;CF&#xff09;的推荐基于近邻的协同过滤基于用户的协同过滤&#xff08;User-CF&#xff09;基于物品的协同过滤&#xff08;Item-CF&#xff09;User-CF 和 Item-CF 的比较基于协同过滤的推荐优缺点基于模型的协同过滤隐语义…

WoW 游戏软件

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 我们选择Tcp协议进行传输&#xff0c;之所以采用tcp,首先是因为tcp传输稳定&#xff0c;相比于udp不稳定的传输&#xff0c;tcp能确保消息一定传输出去。然后是tcp有服务器&#xff0c;相比于 p2p 无服务器模型&#xff0c;tc…

RocketMQ 下载安装

一、下载地址 https://rocketmq.apache.org/download/ 下载完成解压即可 二、安装 2.1 系统环境变量配置 1、右键我的电脑–>属性 ​ 2、高级系统设置–环境变量 ​ 3、系统变量中–>新建 2.2 启动NAMESERVER cmd命令框执行进入至‘MQ文件夹\bin’下 start mqnames…

【教学类-33-02】食物加加加2.0版(3、4、5、10、15、20以内数字加法,随机抽数)

作品展示 3以内点数加法&#xff1a;加法最大值6 4以内点数加法&#xff1a;加法最大值8 背景需求&#xff1a; 幼儿在完成“5以内加法21题、5以内减法21题”时&#xff0c;有两个特点&#xff1a; 1、50%幼儿口算、另外50%不会做的孩子虽然画圈划圈&#xff0c;但更多还是习…

数据结构_图

目录 1. 图的基本概念 1.1 图的定义 1.1.1 有向图 1.1.2 无向图 1.1.3 简单图、多重图 1.1.4 完全图&#xff08;也称简单完全图&#xff09; 1.1.5 子图 1.1.6 连通、连通图和连通分量 1.1.7 强连通图、强连通分量 1.1.8 生成树、生成森林 1.1.9 顶点的度、入度和出…

MapReduce【自定义InputFormat】

MapReduce在处理小文件时效率很低&#xff0c;但面对大量的小文件又不可避免&#xff0c;这个时候就需要相应的解决方案。 默认的输入格式为TextInputFormat&#xff0c;对于小文件&#xff0c;它是按照它的父类FileInputFormat的切片机制来切片的&#xff0c;也就是不管一个文…

Java基础学习(17)网络编程

Java基础学习 一、 网络编程1.1 什么是网络编程1.2 常见的软件架构&#xff1a;1.3 网络编程的三要素1.4 IP1.4.1 InetAddress用法 1.5 端口号1.6 协议1.6.1 UDP协议1.6.1.1 UDP的三种通信方式 1.6.2 TCP协议1.6.2.1 TCP底层原理 一、 网络编程 1.1 什么是网络编程 解释&…

C++常用的支持中文的GUI库Qt 6之一:下载、安装与使用

C常用的支持中文的GUI库Qt 6之一&#xff1a;下载、安装与使用 因为Qt发展变化较快&#xff0c;网上许多介绍Qt的下载、安装与使用已过时&#xff0c;初学者常因行不通而受挫&#xff0c;故此发布本文&#xff0c;以Qt 6.2.4开源版在Windows 10安装与使用为例介绍。 C好用的GU…

DM8:达梦数据库宕机版本记录汇总(持续更新中)

DM8:达梦数据库宕机版本记录汇总&#xff08;持续更新中&#xff09; 环境介绍1 SQL引起的数据库故障1.1 SQL引起的数据库故障汇总表1.2 gdb dmserver core 调试得到数据库崩溃时的内存信息1.3 优化参数解决故障 环境介绍 在测试环境或生产环境&#xff0c;特别情况下会遇到数…