【图论】图的存储--链式前向星存图法以及深度优先遍历图

这篇具有很好参考价值的文章主要介绍了【图论】图的存储--链式前向星存图法以及深度优先遍历图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图的存储

介绍

无向图-就是一种特殊的有向图->

只用考虑有向图的存储即可

有向图

  • 邻接矩阵
  • 邻接表

邻接表

【图论】图的存储--链式前向星存图法以及深度优先遍历图,蓝桥杯,算法竞赛入门,图论,深度优先,算法

存储结构:
(为每一个点开了一个单链表,存储这个点可以到达哪个点)

  • 1:3->4->null
  • 2:1->4->null
  • 3:4->null
  • 4:null
插入一条新的边

【图论】图的存储--链式前向星存图法以及深度优先遍历图,蓝桥杯,算法竞赛入门,图论,深度优先,算法

比如要插一条边:2->3

  • 先找到 2 对应的单链表
  • 然后将 3 插入到单链表里面去(一般使用头插)

对应的结构变化为:

  • 1:3->4->null
  • 2:3->1->4->null
  • 3:4->null
  • 4:null
插入边 Coding Part
#include <iostream>
#include <cstring>
#define p(e) print(e, sizeof(e)/sizeof(int))
using namespace std;

const int N = 100010, M = N * 2;
//N表示结点数量上限,M表示结点数值上限

int h[N], e[M], ne[M], idx;

//插入一个a->b
inline void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
	/*
		* idx是没有使用的空结点索引
		* 先给这个位置赋值b					# e[idx] = b
		* 然后让这个结点指向头结点			# ne[idx] = h[a]
		* 然后再更新头结点 					# h[a] = idx++
		* 同时让idx移动到新的空结点索引中去 # idx++
	*/
}

inline void print(int arr[], int n) {
	for (int i = 0; i < n; i++) cout << arr[i] << ' ';
	cout << endl;
}

int main() {
	memset(h, -1, sizeof h);
}

遍历图

深度优先方法遍历图
  • 需要使用一个bool数组存放是否遍历的状态
  • 然后进行深度优先遍历
#include <iostream>
#include <cstring>

using namespace std;

const int N = 100010, M = N * 2;
//N表示结点数量上限,M表示结点数值上限

int h[N], e[M], ne[M], idx;
bool st[N];
//插入一个a->b
inline void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
	/*
		* idx是没有使用的空结点索引
		* 先给这个位置赋值b					# e[idx] = b
		* 然后让这个结点指向头结点			# ne[idx] = h[a]
		* 然后再更新头结点 					# h[a] = idx++
		* 同时让idx移动到新的空结点索引中去 # idx++
	*/
}

inline void dfs(int u) {
	st[u] = true;
	cout << u << ' ' ;
	for (int i = h[u]; i != -1; i=ne[i]) {
		int j = e[i];
		if (!st[j]) dfs(j);
	}
}

int main() {
	memset(h, -1, sizeof h);
	memset(st, false, sizeof st);
	add(1, 3);
	add(3, 5);
	add(3, 6);
	add(1, 2);
	add(1, 8);
	dfs(1);
}
题目:树的重心

给定一棵树,树中包含n个结点,(编号为1~n)和n-1个无向边
请找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。
重心定义:重心是指树中的一个结点,如果将这个结点删除后,剩余各个连通块中点数的最大值最小,那么这个结点被称为树的重心。
输入格式
第一行包含整数 n,表示树的结点数。
接下来 n-1 行,每行包含两个整数 ab,表示 ab 之前存在的一条边。

输出格式
输出一个整数 m,表示重心的所有子树中最大子树的结点数目。

数据范围
1 <= n <= 105

输入样例

9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6

输出样例

4

答案代码

#include <iostream>
#include <cstring>

using namespace std;

const int N = 100001, M = N*2;
int h[N], e[M], ne[M], idx;
bool st[N];

//a->b
void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

/*遍历模板*/
void dfs_template(int u) {
	st[u] = true;
	cout << u << ' ';
	for (int i = h[u]; i != -1; i = ne[i]) {
		int j = e[i];
		if (!st[j]) {
			dfs_template(j);
		}
	}
}

int n;										//n为题目输入的结点数量
int ans = INT_MAX;							//初始化题目要求的最小值
int dfs(int u) {
	//每一棵树找到最大连通块的数量
	st[u] = true;
	int sum = 1, res = 0;							//sum统计子结点(包括自己)的数量, res统计儿子树最大连通块数量
	for (int i = h[u]; i != -1; i = ne[i]) {
		int j = e[i];
		if (!st[j]) {
			int s = dfs(j);
			sum += s;							//加上子节点的数量
			res = max(s, res);					//找到子树中的最大连通块
		}
	}
	res = max(res, n-sum);							//和父亲树进行比较
	ans = min(ans, res);							//更新答案
	return sum;
}

int main() {
	memset(h, -1, sizeof ne);
	cin >> n;
	for (int i = 0; i < n-1; i++) {
		int a, b;
		cin >> a >> b;
		add(a, b), add(b, a);
	}
	dfs(1);
	cout << ans << endl;
}
宽度优先方法遍历图

补充两个图论的概念:文章来源地址https://www.toymoban.com/news/detail-851215.html

  • 重边: 例如,存在两条 1->2 的边,叫重边
  • 自环:例如,1->1叫自环
题目:图中点的层次

到了这里,关于【图论】图的存储--链式前向星存图法以及深度优先遍历图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SPFA + 链式前向星建图【附Java模板】

                                                                                 SPFA算法是什么?它能解决什么样的问题?           🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客🎐 🐳 数据结构与算法专栏的文章

    2024年02月06日
    浏览(38)
  • 蓝桥集训之BFS、DFS和链式前向星

    https://www.bilibili.com/video/BV1RD4y1F7Fq 图一般定义为 二元集 ; 由 顶点集 与 边集 构成。 或者更抽象的说,由一个集合(顶点),和集合上的关系(边)构成 邻接矩阵 邻接表 度,出度,入度 在有向图中,箭头是具有方向的,从一个顶点指向另一个顶点,这样一来,每个顶点 被指

    2023年04月09日
    浏览(38)
  • 算法复习6.1链式前向星(代码块式理解)

    一号初始节点head[1]=3(cnt=3)指向四号节点 edge[3(cnt=3)],其中edge[3].to=4 即四号节点 ,同时令edge[3].next=(new)cnt 指向下一个 ... (循环) 有点像指针,如果功能不复杂的话,可以直接简写为vector快捷操作  

    2024年02月21日
    浏览(58)
  • 搜索与图论(一)(深搜,广搜,树与图的存储遍历,拓扑排序)

    往深里搜,搜到叶子结点那里,回溯,到可以继续到叶子结点深搜的位置。 1、回溯一定要恢复现场 2、定义一个与当前递归层数有关的终止条件(题目要求的东西) 3、每层都用循环判断是否存在可以dfs的路 输出数字组合 全排列的思想解决n皇后问题,用三个bool数组描述限制

    2024年02月19日
    浏览(48)
  • 数据结构——图的基本定义以及图的存储结构,邻接矩阵,邻接表

    目录 图的定义和术语 图的存储结构 顺序存储结构—邻接矩阵 链式存储结构 邻接表 邻接多重表 十字链表 图的遍历 图的连通性问题 有向无环图及其应用 最短路径 图的定义:图是一种非线性的复杂的数据结构,图中的数据元素的关系是多对多的关系 ,在图中我们常常把数

    2024年02月04日
    浏览(55)
  • 【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)

    反向传播(back propagation)是一种用于训练神经网络的算法,其作用是计算神经网络中每个参数对损失函数的影响,从而进行参数更新,使得神经网络的预测结果更加准确。 具体来说,反向传播算法首先通过 前向传播 计算神经网络的预测结果,并与实际结果进行比较,得到

    2024年02月04日
    浏览(60)
  • 23. 图论 - 图的由来和构成

    Hi, 你好。我是茶桁。 从第一节课上到现在,我基本上把和人工智能相关的一些数学知识都教给大家了,终于来到我们人工智能数学的最后一个部分了,让我们从今天开始进入「图论」。 图论其实是一个比较有趣的领域,因为微积分其实更多的是对应连续型的一种数据处理。

    2024年02月07日
    浏览(37)
  • 图论_(1)_图的基本概念

    图(graph) 是由顶点集合和顶点间的二元关系集合(即边的集合或弧的集合)组成的数据结构,通常可以用 G ( V , E ) G(V,E) G ( V , E ) 表示 顶点集合(vertext set) 用 V ( G ) V(G) V ( G ) 表示,其中元素称为 顶点(vertex) ,用 u 、 v u、v u 、 v 等符号表示。 边的集合(edge set) 用 E ( G ) E(G) E ( G

    2024年02月05日
    浏览(45)
  • 离散数学-图论-图的基本概念(11)

    1.1 图的定义 定义1: 一个 无向图 G是一个有序的二元组V,E,其中 (1)V是一个非空有穷集,称为顶点集,其元素称为顶点或结点。 (2)E是无序积VV的有穷多重子集,称为边集,其元素称为无向边,简称边。 定义2: 一个 有向图 D是一个有序的二元组V,E,其中 (1)V是一个非

    2024年02月13日
    浏览(47)
  • 图论 (Java) 从入门到入土 /第一部分 图的基础-图的表示/

            图,是一种比较复杂的数据结构。和树的一个节点只和上层一个节点相连不同,在图中,任意两个节点都可能相连,且可能具有方向性,并且节点的边具有权重,因此,图被用于描述各种复杂的数据对象,在自然科学、社会科学和人文科学等诸多领域有着非常广泛

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包