当前位置: 首页 > news >正文

关于图的算法题总结

目录

解决方法

DFS

递归实现

非递归实现

BFS

递归实现

非递归实现

DFS+三色染色(可用于检查成环)

递归实现

非递归实现

多源BFS

并查集(可用于检查成环)

拓扑排序

Floyd最短路径

Dijkstra最短路径

最小生成树

Kruskal 算法

Prim 算法


解决方法

DFS

递归实现

200. 岛屿数量 - 力扣(LeetCode)

class Solution {
public:vector<int> dx{1, -1, 0, 0};vector<int> dy{0, 0, 1, -1};int cnt = 0;int m, n;void dfs(int x, int y, vector<vector<char>>& grid, vector<vector<int>>& visited) {if (x < 0 || y < 0 || x >= m || y >= n) return;  // ✅ 用 m 和 n 分别判断if (grid[x][y] == '0' || visited[x][y]) return;visited[x][y] = 1;for (int i = 0; i < 4; i++)dfs(x + dx[i], y + dy[i], grid, visited);}int numIslands(vector<vector<char>>& grid) {m = grid.size();      // ✅ 行数if (m == 0) return 0;n = grid[0].size();   // ✅ 列数vector<vector<int>> vis(m, vector<int>(n, 0));for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (grid[i][j] == '1' && vis[i][j] == 0) {dfs(i, j, grid, vis);cnt++;}}}return cnt;}
};

非递归实现

易错点:在遍历二叉树的时候,应该先push入栈的是right右孩子,而不是left左孩子,因为栈是先进后出。

547. 省份数量 - 力扣(LeetCode)

class Solution {
public:void dfs(int start, vector<bool>& vis, vector<vector<int>>& isConnected){stack<int> st;st.push(start);while(!st.empty()){int root = st.top();st.pop();//遍历邻接矩阵找到root的邻居并放入栈for(int i = 0; i < isConnected.size(); i++){//如果是root邻居且没有被访问过if(isConnected[root][i]==1 && vis[i]==false){st.push(i);vis[i] = true;}}}}int findCircleNum(vector<vector<int>>& isConnected) {//基于DFS书写int ans = 0; //用于记录省份数量vector<bool> vis(isConnected.size(), false);//初始化访问数组for(int i = 0; i < isConnected.size(); i++){if(vis[i] == false){vis[i] = true;dfs(i, vis, isConnected);ans++;} //如果这个节点没有被访问过}return ans;}
};

BFS

递归实现

BFS 本身“队列式”的访问顺序决定了它天然不适合用纯粹的递归模拟;

非递归实现

103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)

class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {//思路就是基于队列的BFSvector<vector<int>> res;queue<TreeNode*> qe;if(root!=nullptr) qe.push(root);while(!qe.empty()){vector<int> level;int n = qe.size();for(int i = 0; i<n; i++){TreeNode* now = qe.front();level.push_back(now->val);qe.pop();if(now->left!=nullptr) qe.push(now->left);                if(now->right!=nullptr) qe.push(now->right);}//只不过最后push_back的时候做个判断如果是奇数层就reverse一下if
http://www.dtcms.com/a/606702.html

相关文章:

  • HarmonyOS:动画衔接
  • 百度收录不了网站建设网站注意实现
  • 方寸之间藏智慧:家用电器的进化与生活革新
  • 智能手机市场再次洗牌,远控何以成为数码生活新“连接器”?
  • 网站建设宣传软文范例新洲网站建设
  • 建旅游网站费用明细网站建设公司 优势
  • CSS笔记
  • 个人网站怎么建立要多少钱宣传册
  • Plaxis岩土工程全模块Python自动化建模与案例,涵盖塑性、渗流、固结、动力、稳定安全及热力TM等核心问题
  • 双人对话生成模型 MOSS 上线,支持零样本语音克隆
  • SMOTE详解
  • 16.【NXP 号令者RT1052】开发——实战-FlexPWM 输出
  • Datawhale coze-ai-assistant task2
  • NESTJS - RSA加解密
  • 自己服务器可以做网站如何做家教网站赚钱
  • 开发外贸网站开发企业官网的建设
  • 一、Rabbit MQ 初级
  • 单位网站建设费用神马搜索推广
  • 【MySQL】MySQL内置函数--日期函数字符串函数数学函数其他相关函数
  • 数据结构 力扣 练习
  • 2018年网站建设发言凯里网站开发
  • XML 和 JSON -----几种重要模式
  • 【读论文】基于LLM增强的全双工对话
  • 怎么做网站不被发现崇明网站开发
  • Java后端常用技术选型 |(二)工具类篇
  • FPGA教程系列-Vivado IP核BMG核
  • 【1.11】基于FPGA的costas环开发5——环路滤波器模块开发
  • 济南行知网站建设南京淄博网站建设工作室
  • 网站木马 代码网站建设新手
  • 汕头市国外网站建设公司百度关键词优化查询