图的存储--邻接矩阵/边集数组/邻接表/链式邻接表/链式前向星

news2024/10/7 7:25:03

邻接矩阵

使用二维数组w[u][v]存储点u到点v的边的权值。一般应用在点数不多的稠密图
时间复杂度:O(n2)
空间复杂度:O(n2)
在这里插入图片描述

int w[N][N];		// edge
int vis[N];			// visited

void dfs(int u){
	vis[u] = true;
	for(int v = 1; v <= n; ++ v)
		if(w[u][v]){
			printf(%d, %d, %d\n", u,v,w[u][v]);
			if(vis[v]) continue;		// 防止重复访问
			dfs(v);
		}
}

int main(){
	cin >> n >> m;
	for(int i = 1; i <= m; ++ i){
		cin >> a >> b >> c;
		w[a][b] = c;
		w[b][a] = c;			// 无向图
	}
	dfs(1);
	return 0;
}

边集数组

边集数组e[i]存储第i条边的「起点、终点、边权」。在kruskal算法中,将边按边权排序,直接存边。
时间复杂度:O(nm)
空间复杂度:O(m)
在这里插入图片描述

struct edge{
	int u, v, w;
}e[M];
int vis[N];

void dfs(int u){
	vis[u] = true;
	for(int i = 1; i <= m; ++ i){		// 不知道节点后边有多少边。暴力枚举m次。
		if(e[i].u == u){				// 枚举以u做起点的边
			int v = e[i].v, w = e[i].w;
			printf(%d, %d, %d\n", u,v,w[u][v]);
			if(vis[v]) continue;
			dfs(e[i].v);
		}
}

int main(){
	cin >> n >> m;
	for(int i = 1; i <= m; ++ i){
		cin >> a >> b >> c;
		e[i] = {a, b, c};
		// e[i] = {b, a, c};	// 无向图
	}
	dfs(1);
	return 0;
}

邻接表

出边数组e[u][i]存储u的所有出边「终点v,边权w」。可以处理各种图,不能处理反向边。效率最高。
时间复杂度:O(n+m)
空间复杂度:O(n+m)
在这里插入图片描述

struct edge{int v, w};
vector<edge> e[N];		// 

void dfs(int u, int fa){
	for(auto ed : e[u]){
		int v = ed.v, w = ed.w;
		if(v == fa) continue;			// 终点等于父节点,防止循环访问
		printf(%d, %d, %d\n", u,v,w);
		dfs(v, u);
	}
}

int main(){
	cin >> n >> m;
	for(int i = 1; i <= m; ++ i){
		cin >> a >> b >> c;
		e[a].push_back({b, c});
		e[b].push_back({a, c});
	}
	dfs(1, 0);			// 假设1号节点的父节点是0
	return 0;
}

链式邻接表

边集数组e[j]存储第j条边的「起点u、终点v、边权w」。能处理反向边
表头数组h[u][i]存储u点的所有出边的编号
时间复杂度:O(n+m)
空间复杂度:O(n+m)
在这里插入图片描述

struct edge{int u, v, w};
vector<edge> e;			// 
vector<int> h[N];		// 点的所有出边

void add(int a, int b, int c){
	e.push_back({a, b, c});
	h[a].push_back(e.size() - 1);		// h记录该编号节点的所有出边的编号
}

void dfs(int u, int fa){
	for(int i = 0; i < h[u].size(); ++ i){ // u为起点的编号
		int j = h[u][i];				// j为终点的编号
		int v = e[j].v, w = e[j].w;
		if(v == fa) continue;			// 终点等于父节点
		printf(%d, %d, %d\n", u,v,w);
		dfs(v, u);
	}
}

int main(){
	cin >> n >> m;
	for(int i = 1; i <= m; ++ i){
		cin >> a >> b >> c;
		add(b, c);
		add(a, c);
	}
	dfs(1, 0);			// 假设1号节点的父节点是0
	return 0;
}

链式前向星

一个表头数组悬挂多个链表
边集数组e[i]存储第i条出边的「终点v、边权w、下一条边ne
表头数组h[u]存储u点的第一条出边的编号
边的编号idx可取0,1,2,3

时间复杂度:O(n+m)
空间复杂度:O(n+m)
在这里插入图片描述

struct edge{int v, w, ne};	// 终点、边权、下一条边编号
edge e[M];				// 边集
int idx, h[N];			// 第一条出边

void add(int a, int b, int c){
	e[idx] = {b, c, h[a]};	// 每个点后加的第一条边的h值一定是-1
	h[a] = idx++;		// idx记录边的编号,没加一条边就增加1。头插法,先插后访问。
}

void dfs(int u, int fa){
	// -1取反为0
	for(int i = h[u]; ~ i; i = e[i].ne){ // u为起点的编号,h[u]就是u节点第一条出边编号
		int v = e[i].v, w = e[i].w;
		if(v == fa) continue;			// 终点等于父节点
		printf(%d, %d, %d\n", u,v,w);
		dfs(v, u);
	}
}

int main(){
	cin >> n >> m;
	memset(h, -1, sizeof h);		// 表头初始化为-1,遍历到-1说明结束
	for(int i = 1; i <= m; ++ i){
		cin >> a >> b >> c;
		add(a, b, c);
		add(b, a, c);
	}
	dfs(1, 0);			// 假设1号节点的父节点是0
	return 0;
}

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

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

相关文章

Java 基础进阶篇(六)—— 面向对象三大特征之三:多态

文章目录 一、多态的概述二、多态中成员访问特点 ★三、多态的优势与劣势四、多态下的类型转换4.2 自动类型转换&#xff08;从子到父&#xff09;4.2 强制类型转换&#xff08;从父到子&#xff09;4.3 instanceof 关键字 一、多态的概述 多态&#xff1a;是指执行同一个行为…

自动驾驶——最优控制算法里卡提方程推导【连续系统】

1. Why use the Riccati equation&#xff1f; Q、R就是需要设计的半正定矩阵和正定矩阵。考虑根据实车的情况去标定此参数&#xff0c;从理论和工程层面去理解&#xff0c;如果增大Q、减小R&#xff0c;则此时控制系统响应速度比较快速&#xff08;比较剧烈&#xff09;&…

[SpringBoot]什么是服务器前后端的一个流程图bmi练习案例

前点: 服务器&#xff1a; 服务器就是一台高性能的电脑, 在电脑上安装了提供XXX服务的软件, 这台电脑就可以称为XXX服务器 - 举例: - 数据库服务器: 在电脑上安装了提供数据增删改查服务的软件(DBMS) - 邮件服务器: 在电脑上安装了提供邮件收发服务的软件 - FTP服务器: …

普通的2D Average pooling是怎么进行backward的呢?

二维平均池层计算损失相对于其输入张量的梯度&#xff0c;方法是将损失相对于输出张量的梯度均分在输入子区域&#xff0c;这些子区域在前向传播中被用来计算平均值。 由于平均集合计算的是每个输入子区域的平均值&#xff0c;所以子区域中的每个元素对平均值的贡献是相同的。…

Java Servlet_HTTP

今日内容 零、 复习昨日 一、Servlet 二、HTTP 三、HttpServlet 零、 复习昨日 见晨考 一、Servlet 1.1 介绍 javaweb开发,就是需要服务器接收前端发送的请求,以及请求中的数据,经过处理(jdbc操作),然后向浏览器做出响应. 我们要想在服务器中写java代码来接收请求,做出响应,我…

SignOff Criteria——AOCV(Advanced OCV) introduction

文章目录 1. O v e r v i e w Overview Overview2. A O C V P r i n c i p l e I n t r o d u c t i o n AOCV\ Principle\ Introduction AOCV Principle Introduction2.1 G B A − A O C V GBA-AOCV GBA−AOCV2.1.1 A b o u t L o g i c a l D e p t h About\ Logical\ De…

第六章 Iptables与Firewalld防火墙

第六章 Iptables与Firewalld防火墙 一、Iptables 1、策略与规则链 &#xff08;1&#xff09;、防火墙策略规则的设置 一种是“通”即放行&#xff0c;另一种是“堵”即阻止。 当防火墙的默认策略为拒绝时&#xff08;堵&#xff09;&#xff0c;就要设置允许规则通&#x…

NECCS|全国大学生英语竞赛C类|听力|短对话|14:20~15:30

目录 一、短对话 1. 定位词 2. 场景词汇 &#xff08;1&#xff09;餐馆用餐 &#xff08;2&#xff09;商场用语 &#xff08;3&#xff09;校园用语 &#xff08;4&#xff09;图书馆用语 二、题目类型 1. 人物类 考点聚焦 2. 地点类 主要涉及 3. 数字类 4. 主题…

【数据库】JDBC编程

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 前言 什么是JDBC&#xff1f; JDBC工…

sql注入(三)绕过方法及防御手段

一、sql注入的绕过方法 1.注释符过滤绕过 常用的注释符有&#xff1a; 1&#xff09;-- 注释内容 2&#xff09;# 注释内容 3&#xff09;/* 注释内容 */ 绕过方法 构造闭合&#xff1a; ?id1 and sql语句 and 11 这样接收源码前面的引号被 id1 中的后引号所闭合&…

关于MPU的笔记

MPU&#xff08;memory protection unit&#xff09;内存保护单元。这些系统必须提供一种机制来保证正在运行的任务不破坏其他任务的操作。即要防止系统资源和其他一些任务不受非法访问。嵌入式系统有专门的硬件来检测和限制系统资源的访问。它能保证资源的所有权&#xff0c;任…

unity 性能优化之画质分级

如果你的游戏兼容多平台&#xff0c;或者当前平台的设备也有硬件差距&#xff0c;比如低端设备就是带不动你的画质&#xff0c;无论如何你如何优化就是带不动。这种情况下&#xff0c;我们可以考虑对画质进行分级&#xff0c;减少一些特性&#xff0c;来提高运行质量。接下来我…

JavaWeb《HTML基础标签》

本笔记学习于Acwing平台 MDN官方文档https://developer.mozilla.org/zh-CN/ 目录 1. html文件结构 2. 文本标签 3. 图片 4. 音频和视频 5. 超链接 6. 表单 7. 列表 8. 表格 9. 语义标签 10. 特殊符号 1. html文件结构 文档结构 html的所有标签为树形结构&#xff…

AI模型推理(3)——ModelMesh使用

参考&#xff1a; ModelMesh installation - KServe Documentation Website ModelMesh Overview - KServe Documentation Website 前言 Kserve提供了“Serverless”和“ModelMesh”两种安装模式。其中Serverless是通过Knative组件实现动态扩缩容等功能。而ModelMesh则是另一…

华南X99F8D开不了机——主板出现错误码67的解决方案

华南X99F8D开不了机——主板出现错误码67的解决方案 前言 笔者的双路e5&#xff1a;大数据双路e5主机搭建&#xff1a;2696v3256g内存 配置&#xff1a; 主板&#xff1a;x99f8d CPU&#xff1a;e5 2696v3 *2 【36核72线程】 内存条&#xff1a;DDR4 ECC 32G *8 【256G】 显…

Nginx + LVS + KeepAlived实现高可用集群

文章目录 一、名词解释1、高可用集群2、LVS3、Keepalived 二、搭建流程1、安装Docker2、安装Nginx3、安装Keepalived4、编写nginx_check.sh脚本 一、名词解释 1、高可用集群 对于中小型互联网公司&#xff0c;产品所承受的请求量还是比较低的&#xff0c;所以一般使用单节点N…

碳中和专题:智慧城市建设能否提高碳生产率?—基于中国智慧城市试点的准自然实验

一.研究内容 目前&#xff0c;中国面临着如何在保证经济增长的前提下实现减排目标的困境。智能城市建设作为一种新型的城市发展模式&#xff0c;有可能成为解决这一问题的关键。本文使用多周期双重差分DID模型进行实证分析&#xff0c;旨在评估智能城市试点政策对碳生产率的影响…

论文笔记:Model-Contrastive Federated Learning

0 简介 论文&#xff1a;Model-Contrastive Federated Learning 代码&#xff1a;https://github.com/QinbinLi/MOON 相关链接&#xff1a;本文主要是将SimCLR对比学习的思想迁移到联邦学习中&#xff0c;关于SimCLR的介绍见https://blog.csdn.net/search_129_hr/article/deta…

最好的物联网教程:软硬结合——从零打造物联网

在大学里不同专业有着不同的追求&#xff1a;机械类与强电类专业学生追求的是 “机电合一” &#xff0c;既懂机械又懂电气&#xff0c;整个电气机械自动化便能打通。弱电类专业学生追求的是 “软硬结合” &#xff0c;既懂硬件又懂软件&#xff0c;整个电子产品便能打通。我作…

唱作音乐人朱卫明新歌全网首发,当初恋遇到《龙仙街》

今年唱作音乐人朱卫明正式出道25周年了&#xff01;为纪念这个生涯里程碑&#xff0c;朱卫明近日在酷狗音乐首发全新单曲《龙仙街》&#xff0c;上酷狗搜索“朱卫明”&#xff0c;即可抢先收听。 这首歌是继《酒吧情歌》《不爱她》《只要陪着你》《有缘无分》《断了吧》《疯狂爱…