首页 > 编程语言 >Offer68题 Day3 两个基础算法

Offer68题 Day3 两个基础算法

时间:2024-10-29 21:08:47浏览次数:6  
标签:graph Day3 Offer68 访问 算法 vector visited include 节点

1. DFS深度优先算法


/*
	- 深度优先算法
		DFS 从起始节点出发,沿着一条路径尽可能深入地访问每个节点,直到无法继续时再回退,寻找未访问的节点。
	- 使用递归实现。
*/
#include <iostream>
#include <vector>

using namespace std;

void DFS(int node, vector<vector<int>>& graph, vector<bool>& visited) {
	visited[node] = true;                 // 标记当前节点为已访问
	cout << node << " ";                  // 输出当前节点

	for (int neighbor : graph[node]) {    // 遍历当前节点的所有邻居节点
		if (!visited[neighbor]) {         // 如果邻居节点未被访问
			DFS(neighbor, graph, visited);// 递归调用DFS访问该邻居节点
		}
	}
}

int main() {
	vector<vector<int>> graph = {
		{1, 2}, {0, 3, 4}, {0}, {1}, {1} // 邻接表表示的图
	};

	vector<bool> visited(graph.size(), false);       // 初始化访问标记数组,全部为 false
	cout << "DFS: ";
	DFS(0, graph, visited);               // 从节点 0 开始 DFS
	return 0;
}

2. BFS广度优先算法


/*
	- 广度优先算法
		BFS 从起始节点出发,逐层访问相邻节点。先访问起始节点,再访问其所有邻居节点,然后逐层扩展。
	- 使用队列实现。
*/

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

void BFS(int start, vector<vector<int>>& graph,vector<bool> &visited) {
	queue<int> q;

	visited[start] = true;    // 标记起始节点为已访问
	q.push(start);            // 将起始节点加入队列

	while (!q.empty()) {      // 当队列非空时
		int node = q.front(); // 获取队列首节点
		q.pop();              // 移除队列首节点
		cout << node << " ";  // 输出当前节点

		for (int neighbor : graph[node]) { // 遍历当前节点的所有邻居节点
			if (!visited[neighbor]) {      // 如果邻居节点未被访问
				visited[neighbor] = true;  // 标记邻居节点为已访问
				q.push(neighbor);          // 将邻居节点加入队列
			}
		}
	}
}

int main() {
	vector<vector<int>> graph = {
		{1, 2}, {0, 3, 4}, {0}, {1}, {1} // 邻接表表示的图
	};
	vector<bool> visited(graph.size(), false); // 初始化访问标记数组

	cout << "BFS: ";
	BFS(0, graph,visited);               // 从节点 0 开始 BFS
	return 0;
}

标签:graph,Day3,Offer68,访问,算法,vector,visited,include,节点
From: https://www.cnblogs.com/itsinsane/p/18514503

相关文章

  • 代码随想录算法训练营day30| 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.
    学习资料:https://programmercarl.com/0452.用最少数量的箭引爆气球.html重叠区域问题最远位置问题452.用最少数量的箭引爆气球(重叠区域;按左边界排序;i区间的左边界与i-1区间的右边界比较来确定是否重叠;更新i的右边界,取i与i-1区域右边界的最小值)点击查看代码classSolution(ob......
  • 代码随想录一刷-day3
    T209长度最小子数组核心:滑动窗口思想,如何用一个for循环达到两个循环的效果for(intj=0;j<num.size();j++){sum+=nums[j];//外层for循环内负责将窗口结束的坐标++;while(sum>=target){window_length=j-i+1;result=min(result,window_length);sum-=nums[i++];......
  • 算法刷题记录(day5)
    LC160.相交链表题目描述:给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。classSolution{public:ListNode*getIntersectionNode(ListNode*headA,ListNode*headB){if(head......
  • 字符串匹配-KMP算法实现代码
    字符串的基本操作同上一篇BF算法一致一.为模式串创建临时数组//KMP算法//1)为模式串创建临时数组voidcomputeLPSArray(char*pat,intM,int*lps){ //指向首元素 intj=0; //指向首元素的下一个元素 inti=1; //临时数组的首元素总为0 lps[0]=0; //结束条......
  • 【算法】分治算法-让问题消失
    博主推荐!!!:"近期我偶然邂逅了一个极为出色的人工智能学习平台,它不仅内容深入浅出,讲解方式还风趣幽默,让人学习起来既轻松又高效。如此宝藏资源,我迫不及待想要与各位共享,让我们一起进入这个精彩纷呈的学习网站吧!"即刻点击https://www.captainbed.cn/cyy算法系列:今天,我们要聊的......
  • 【算法学习】基环树
    基环树基环树就是类似于在树上加了一条边形成了环,去点环上的一条边后就会变成数,如下图。这是一个\(n\)个点\(n\)条边的连通图,如果不保证联通,它就会成为基环树森林。外向树:每个点都只有一条入边,因为向内上。内向树:每个点都只有一条出边,因为向外少。怎么用呢?因为有环的性......
  • 算法:查找
    算法1.顺序查找和折半查找1.1顺序查找1.2折半查找1.3索引顺序查找2.树表查找2.1查找2.2插入3.哈希表及哈希查找3.1哈希造表3.2处理冲突开放定址法链地址法3.3哈希查找查找是非数值数据处理中一种基本运算,查找运算的效率与查找表所采用的数据结构和查找......
  • 解码小红书CES算法,让你的笔记阅读量提升100%
    随着社交媒体成为日常生活的一部分,内容创作者们都在积极寻找提高作品可见性的方法。作为社交分享领域的佼佼者,小红书凭借其独特的CES算法机制,在众多平台中脱颖而出。本文将深入探讨小红书的CES算法工作原理,并提供实用技巧,帮助你显著提升笔记的阅读量。一、小红书CES算法解......
  • (算法)最⻓公共⼦序列————<动态规划>
    1.题⽬链接:1143.最⻓公共⼦序列2.题⽬描述:3.解法(动态规划):算法思路:1.状态表⽰:对于两个数组的动态规划,我们的定义状态表⽰的经验就是:        i.选取第⼀个数组[0,i]区间以及第⼆个数组[0,j]区间作为研究对象;        ii.结合题⽬要求,定义状态......
  • 点云学习笔记4——点云滤波降采样后进行4PCS粗配准【四点一致集配准算法(4-Point Congr
    #include<iostream>#include<pcl/point_cloud.h>#include<pcl/point_types.h>#include<pcl/filters/voxel_grid.h>#include<pcl/common/common_headers.h>#include<pcl/io/pcd_io.h>#include<pcl/visualization/cloud_vi......