算法基础--------【图论】

图论(待完善)

DFS:和回溯差不多
BFS:进while进行层序遍历

定义: 图论(Graph Theory)是研究图及其相关问题的数学理论。图由节点(顶点)和连接这些节点的边组成。图论的研究范围广泛,涉及路径、流、匹配、着色等诸多问题。

特点:
节点和边: 图论问题通常围绕节点(点)和边(线)展开,研究它们之间的关系。
图的种类: 包括无向图、有向图、加权图等不同类型的图,每种图有不同的应用场景。
算法: 常见的图论算法包括深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(如Dijkstra算法、Floyd-Warshall算法)、最小生成树算法(如Kruskal算法、Prim算法)等。(Dijkstra华子暑期实习笔试考了)
适用范围: 广泛用于网络分析、路径规划、资源分配等领域,如社交网络、交通系统、计算机网络等。(网络分析,路径规划这个真的很爱考)
示例: 最短路径问题(如寻找城市之间的最短路线)是一个经典的图论问题,通常用Dijkstra算法或Bellman-Ford算法解决。

【200】岛屿数量

要么用DFS的思想,要么用BFS层序遍历的思想
DFS:节点有四个方向,都遍历一遍,我写的逻辑是先下右上左。
dfs方法: 设目前指针指向一个岛屿中的某一点 (i, j),寻找包括此点的岛屿边界。
从 (i, j) 向此点的上下左右 (i+1,j),(i-1,j),(i,j+1),(i,j-1) 做深度搜索。
终止条件:
(i, j) 越过矩阵边界;
grid[i][j] == 0,代表此分支已越过岛屿边界。
搜索岛屿的同时,执行 grid[i][j] = ‘0’,即将岛屿所有节点删除,以免之后重复搜索相同岛屿。
主循环:
遍历整个矩阵,当遇到 grid[i][j] == ‘1’ 时,从此点开始做深度优先搜索 dfs,岛屿数 count + 1 且在深度优先搜索中删除此岛屿。
最终返回岛屿数 count 即可。

DFS:

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        if(grid.size() == 0 || grid[0].size() == 0)return 0;
        int m = grid.size(),n = grid[0].size();
        vector<vector<int>> vec;
        
        int res =0;
         for(int i =0;i<m;i++){
            vector<int> tempvec;
            for(int j=0;j<n;j++){   
                int tmp = grid[i][j]-'0';
                tempvec.push_back(tmp);//转化成int类型的
            }
            vec.push_back(tempvec);
        } 

        for(int i =0;i<m;i++){
            for(int j=0;j<n;j++){
                if( vec[i][j] == 1){
                    dfs(vec,i,j);//dfs的次数就是岛屿的数量
                    res++;
                }
              
            }
        } 
        return res;
    }   
private:
    void dfs(vector<vector<int>>& vec,int i, int j){
        if(i<0 || j<0 || i>vec.size()-1 || j>vec[0].size()-1)return;
        cout<<"(i,j) = "<<i<<j<<","<<vec[i][j]<<endl;
        if(vec[i][j] != 1)return;
    
        vec[i][j] =-1;//标记
        dfs(vec,i+1,j);
        dfs(vec,i,j+1);
        dfs(vec,i-1,j);
        dfs(vec,i,j-1);
    }
};
int main() {

    Solution s;
    vector<vector<char>> grid = {
    {'1','1','1','1','0'},
    {'1','1','0','1','0'},
    {'1','1','0','0','0'},
    {'0','0','0','0','0'}};
    s.numIslands(grid);
    system("pause");
    return 0;
}

BFS:
借用一个队列 queue,判断队列首部节点 (i, j) 是否未越界且为 1:
若是则置零(删除岛屿节点),并将此节点上下左右节点 (i+1,j),(i-1,j),(i,j+1),(i,j-1) 加入队列;
若不是则跳过此节点;
循环 pop 队列首节点,直到整个队列为空,此时已经遍历完此岛屿。

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        if (grid.empty() || grid[0].empty()) return 0;
        int m = grid.size(), n = grid[0].size();
        int res = 0;
        queue<pair<int, int>> q;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == '1') {
                    q.push({i,j});
                    grid[i][j] = '0'; // 标记为已访问 加入就标记
                    res++;//第一层更新
                    while (!q.empty()) {//BFS遍历
                        int x = q.front().first, y = q.front().second;
                        q.pop();
                        for (const auto& dir : dirs) {
                            int nx = x + dir.first, ny = y + dir.second;
                            if (nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] == '1') {
                                q.push({nx,ny});
                                grid[nx][ny] = '0'; // 标记为已访问
                            }
                        }

                    }
                }
            }
        }


        return res;
    }
private:
    vector<pair<int, int>> dirs{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

};

【994】腐烂的橘子

在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:

  • 0 代表空单元格;
  • 1 代表新鲜橘子;
  • 2 代表腐烂的橘子。

每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1

示例 1:

img

输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4
class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        if(grid.size() == 0 ||grid[0].size() ==0)return -1;
        int m = grid.size();int n = grid[0].size();
        int min = 0;//分钟数
        int fresh = 0;//新鲜橘子
        queue<pair<int,int>> q;//存储腐烂的橘子
        for(int i =0;i<m;i++){
            for(int j =0;j<n;j++){
                if(grid[i][j] == 2){
                    q.push({i,j});
                }else if(grid[i][j] == 1){//统计新鲜橘子
                    fresh++;
                }
            }
        }
       // if(q.empty() || fresh==0 )return -1;//没有腐烂的橘子 没有新鲜的橘子

        vector<pair<int,int>> dirs = {{1,0},{0,1},{0,-1},{-1,0}};
        while(!q.empty()){//每一层
            int qsize = q.size();//有n个烂橘子
            bool flag = false;
            for(int i =0;i<qsize;i++){//遍历这n个烂橘子
                int x = q.front().first;
                int y = q.front().second;
                q.pop();
                for(auto dir:dirs){
                    int nx = dir.first+x;
                    int ny = dir.second+y;
                    if(nx >=0 && nx<m && ny >=0 && ny<n && grid[nx][ny]==1){
                        q.push({nx,ny});
                        grid[nx][ny] = 2;
                        fresh--;//到最后要没有新鲜橘子才结束
                        flag = 1;//有新鲜橘子就标记
                    }
                }
            }
            //一层就要++
            if(flag)min++;//有新鲜橘子才++
        }
        return fresh? -1:min;
    }
};

总结:腐烂的橘子是以各个腐烂的橘子为头结点开始入队遍历的,而岛屿数量是以有无1直接入队遍历。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记——动态路由——OSPF(OSPF协议的工作原理)

八、OSPF协议的工作原理 1、原理概要 (1)相邻路由器之间周期性发送HELLO报文&#xff0c;以便建立和维护邻居关系 (2)建立邻居关系后&#xff0c;给邻居路由器发送数据库描述报文(DBD)&#xff0c;也就是将自己链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器…

【PHP项目实战训练】——后台-RBAC权限管理原理

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

Minecraft玩家设计专用程序 让Google地球可以在游戏中探索

在 Minecraft 中以真实的比例建造真实的地方并不是什么新鲜事。不过&#xff0c;康奈尔理工学院的一名毕业生最近展示了一种方法&#xff0c;可以自动生成一个忠实的 Minecraft 地球&#xff0c;并定期更新。他将在 7 月底举行的 SIGGRAPH 2024 大会上公布该项目的成果。 在七月…

确认偏差:金融市场交易中的隐形障碍

确认偏差&#xff0c;作为一种深刻影响交易员决策与表现的心理现象&#xff0c;其核心在于个体倾向于寻求与既有信念相符的信息&#xff0c;而自动过滤或轻视与之相悖的资讯。这种认知偏见严重扭曲了交易者的决策过程&#xff0c;导致他们过分依赖符合既有观念的数据&#xff0…

鸿蒙开发设备管理:【@ohos.deviceInfo (设备信息)】

设备信息 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import deviceInfo from ohos.deviceInfo属性 系统能力&#xff1a;以下各项对应的系统能力均为SystemCapability.Startup.S…

构建一个让世界瞩目的海外短剧生态系统

构建一个让世界瞩目的海外短剧生态系统是一个复杂但富有挑战性的任务。旨在创建一个全球范围内具有影响力的海外短剧生态系统&#xff1a; 一、市场定位与战略规划 1、深入了解目标市场&#xff1a;研究海外观众的观看习惯、喜好和付费意愿&#xff0c;以制定有针对性的市场策…

3d模型里地毯的材质怎么赋予?---模大狮模型网

在进行3D建模时&#xff0c;赋予地毯逼真的材质是营造现实感和增强场景氛围的重要步骤。模大狮将介绍在常见的3D建模软件中&#xff0c;如何有效地为地毯赋予各种材质&#xff0c;以及一些实用的技巧和注意事项。 一、选择合适的地毯材质 在3D建模中&#xff0c;地毯的材质选择…

OOXML入门学习

进入-飞入 <par> <!-- 这是一个并行动画序列的开始。"par"代表并行&#xff0c;意味着在这个标签内的所有动画将同时开始。 --><cTn id"5" presetID"2" presetClass"entr" presetSubtype"4" fill"hold&…

MS5208T/MS5208N——2.7V 到 5.5V、 12Bit、8 通道轨到轨输出数模转换器

MS5208T/MS5208N 是一款 12Bit 、 8 通道输出的电压型 DAC &#xff0c;内部集成上电复位电路、轨到轨输出 Buffer 。接口采用 三线串口模式&#xff0c;最高工作频率可以到 40MHz &#xff0c;兼容 SPI 、 QSPI 、 DSP 接口和 Microwire 串口。输出接到一个轨到轨…

“AI+”时代,群核科技进化成了家居设计打工人理想的样子

6月&#xff0c;2024世界智能产业博览会上&#xff0c;人工智能大模型展团以“AI大模型驱动新质生产力”为主题&#xff0c;各家企业纷纷提到了基于不同行业场景的应用。 这透露出当前的行业发展趋势强调大模型落地核心行业&#xff0c;产生业务价值。其中&#xff0c;“AI图像…

餐饮点餐的简单MySQL集合

ER图 模型图&#xff08;没有进行排序&#xff0c;混乱&#xff09; DDL和DML /* Navicat MySQL Data TransferSource Server : Mylink Source Server Version : 50726 Source Host : localhost:3306 Source Database : schooldbTarget Server Type …

uniapp 使用cavans 生成海报

uniapp 使用cavans 生成海报 npm install qs-canvas1.创建 useCanvas.js /*** Shopro qs-canvas 绘制海报* version 1.0.0* author lidongtony* param {Object} options - 海报参数* param {Object} vm - 自定义组件实例*/ import QSCanvas from qs-canvas; import { getPos…

最小生成树拓展应用

文章目录 最小生成树拓展应用理论基础 题单1. [新的开始](https://www.acwing.com/problem/content/1148/)2. [北极通讯网络](https://www.acwing.com/problem/content/1147/)3. [走廊泼水节](https://www.acwing.com/problem/content/348/)4. [秘密的牛奶运输](https://www.ac…

Verystar费芮荣获腾讯游戏人生平台2023年度“最佳营销服务商”奖项

先导&#xff1a;Verystar费芮是电通旗下拥有领先的技术支持、数据驱动的客户体验管理 (CXM) 公司&#xff0c; 6月27日腾讯游戏人生合作伙伴大会&#xff0c;宣布 Verystar费芮连续四年荣获“最佳营销服务商”奖项。 6月27日&#xff0c;2024年腾讯游戏人生合作伙伴大会在深圳…

【知识图谱系列】Neo4j使用Py2neo与python进行链接

目录 一、安装py2neo 二、打开Neo4j 三、使用Python操作Neo4j 一、安装py2neo pip install --upgrade py2neo -i https://pypi.tuna.tsinghua.edu.cn/simple 可以先阅读下文档&#xff1a;https://py2neo.org/v4/index.html 这个文档里有好多关于这个工具包的API介绍&#x…

从赛题切入谈如何学习数学建模

1.引言 &#xff08;1&#xff09;今天学习了这个汪教授的这个视频&#xff0c;主要是对于一个赛题的介绍讲解&#xff0c;带领我们通过这个赛题知道数学建模应该学习哪些技能&#xff0c;以及这个相关的经验&#xff0c;我感觉这个还是让我自己受益匪浅的 &#xff08;2&…

Openldap安装部署及Gitea简单配置使用

Openldap安装部署及Gitea简单配置使用 一.安装Openldap #拉取镜像 docker pull osixia/openldap:latestdocker run \ -d \ -p 389:389 \ -p 636:636 \ -v /home/data/openldap/local:/usr/local/ldap \ -v /home/data/openldap/lib:/var/lib/ldap \ -v /home/data/openldap/s…

数据分析报告制作的结构和思路整理

先画重点&#xff1a;一份分析报告的制作&#xff0c;目前的市场的分析步骤是优先找一些别人的研究报告&#xff0c;现成的东西&#xff0c;重点是要好好总结业务逻辑和潜在运营可能&#xff0c;这也是一位优秀数据分析师的价值体现。 举个例子&#xff0c;以目前小说短剧赛道的…

C语言指针速成下篇

c语言的指针下篇终于迎来了收尾&#xff0c;那么废话不多说&#xff0c;我们直接进入正题 指针访问数组 # include <stdio.h> int main () { int arr[ 10 ] { 0 }; // 输⼊ int i 0 ; int sz sizeof (arr)/ sizeof (arr[ 0 ]); // 输⼊ int * p arr //这…

Ubuntu+Apache2 搭建Gerrit 环境

一、前言 时隔多年&#xff0c;好久没有更新CSDN 博客了&#xff0c;主要原因有如下两点&#xff1a; 1、平时工作繁忙&#xff0c;无暇更新。 2、工作内容涉及信息安全&#xff0c;一些工作经验积累不便更新到互联网上。 最近一直在折腾搭建Gerrit 环境&#xff0c;最开始是…