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

news2024/11/25 4:48:56

图论(待完善)

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直接入队遍历。

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

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

相关文章

【VMware】使用和管理 vSphere+(一):监控 vSphere+ 基础架构

目标读者 本指南面向打算使用和管理 vSphere 的任何用户。本信息适用于已在内部部署环境中使用 vSphere 且熟悉虚拟化概念的读者。 《使用和管理 vSphere》提供了有关使用 vSphere 服务的信息&#xff0c;例如从 VMware Cloud 控制台 监控 vSphere 基础架构、查看订阅计费以及更…

前端vue使用onlyoffice控件实现word在线编辑、预览(仅列出前端部分需要做的工作,不包含后端部分)

简介 ONLYOFFICE 文档 是一个开源办公套件&#xff0c;包括文本文档、电子表格、演示文稿和可填写表单的编辑器。 它提供以下功能&#xff1a; 创建、编辑和查看文本文档、电子表格、演示文稿和可填写表单&#xff1b; 与其他队友实时协作处理文件。 基于这个控件&#xff0c;…

Steam夏促史低游戏推荐 Steam夏促哪有游戏值得入手

steam夏季促销来袭&#xff0c;有这很多的游戏都进行打折出售&#xff0c;而且还有这很多的游戏都迎来了史低&#xff0c;简直是白送&#xff0c;很多玩家都想趁着这个时间入手自己喜欢的游戏&#xff0c;为了方便大家了解&#xff0c;下面我给大家带来steam夏季促销史低的游戏…

学习笔记——动态路由——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…

JVM原理(一):JVM运行时数据区域的分析

1. 程序计数器 程序计数器是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器。 作用 在Java虛拟机的概念模型里&#xff0c;字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令&#xff0c;它是程序控制流的指示…

React Native 开发常见问题及注意事项

本文只是使用时积累的一些经验 开发环境 1、Android Studio 依赖项下载慢 如果发现依赖下载非常慢&#xff0c;动不动十几KB的 参考&#xff1a;加速 Android Studio 依赖项下载 也可以切换数据源 修改 android/build.gradle中的jcenter()和google() repositories {// goo…

UI设计必备的6个网站,赶紧收藏!

6个UI设计必备网站&#xff0c;找素材、找灵感一步到位&#xff0c;赶紧收藏起来吧&#xff01; 1、菜鸟图库 UI图片素材-UI图片模板免费下载 - 菜鸟图库 菜鸟图库提供了超多免费设计素材&#xff0c;在这里你可以找到平面、UI、电商等设计类素材&#xff0c;还有大量的高清背…

【2024年更新】ZF关注度指数大合集(包含8类数据)

数据简介&#xff1a;共包含8类数据 1. 地方ZF环境关注度指数&#xff1a;2007-2021 2. 地方ZF数字关注度指数&#xff1a;1999-2021 3. 省级ZF数字关注度指数&#xff1a;2001-2024 4. 农业新质生产力ZF关注度指数&#xff1a;2001-2024 5. 新质生产力ZF关注度指数&#…

蚂蚁- 定存

一&#xff1a;收益变动&&收益重算 1.1: 场景组合 1: 澳门元个人活期&#xff0c;日终余额大于0&#xff0c;当日首次、本周本月非首次系统结息&#xff0c;结息后FCDEPCORE_ASYN_CMD_JOB捞起进行收益计算 【depc_account_revenue_detail】收益日 > 【depc_accoun…

JAVA:Word2Vec的使用

1、简介 Word2Vec是 Google 在 2013 年年中开源的一款将词表征为实数值向量的高效工具, 其利用深度学习的思想&#xff0c;可以通过训练&#xff0c;把对文本内容的处理简化为 K 维向量空间中的向量运算&#xff0c;而向量空间上的相似度可以用来表示文本语义上的相似度。 Wo…

计算机网络之体系结构

上节内容&#xff1a;数据通信原理 1.计算机网络体系结构 体系结构: 研究系统中各组成成分及其关系的一门学科。 计算机网络体系结构: 定义和描述一组用于计算机及其通信设施之间互连的标准和规范的集合&#xff0c;遵循这组规范可以很方便地实现计算机设备之间的通信。 相互…

uni-app 自定义支付密码键盘

1.新建最贱 payKeyboard .vue <template><view class"page-total" v-show"isShow"><view class"key-list"><view class"list" v-for"(item,index) in keyList" :class"{special:item.keyCode190…

零知识证明基础:数字签名

1、绪论 数字签名(Digital Signature)&#xff0c;也称电子签名&#xff0c;是指附加在某一电子文档中的一组特定的符号或代码。它利用密码技术对该电子文档进行关信息提取并进行认证形成&#xff0c;用于标识签发者的身份以及签发者对电子文档的认可&#xff0c;并能被接收者…

统信系统实战(2):安装redis

在系统中未发现redis,需要安装。 网上资料上说需要去redis官网下载,但是发现不管是github账号还是自己注册的sso账号,都各种提示有问题。 继续找资料,发现可以直接通过下载链接下载,指令如下: wget http://download.redis.io/releases/redis-6.0.6.tar.gz 成功下载,…

Charles网络抓包工具安装和web抓包(一)

目录 概述 抓包工具对比 安装 下载 web抓包配置 按键说明 前言-与正文无关 ​ 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#…

国外问卷调查,让你远离酷暑的赚钱新方式

大家好&#xff0c;我是汇舟问卷&#xff0c;一家专注于国外问卷调查领域的互联网企业。随着夏季的到来&#xff0c;高温酷暑无疑给许多人的日常工作带来了极大的不便与挑战。 在这样的季节里&#xff0c;我们都在寻求一种既能实现经济收益又能避免高温炙烤的工作模式。 在此…

GPU设置

GPU降温测试 前提 同一个训练程序&#xff0c;使用8块GPU&#xff0c;GPU使用率基本全程>90%&#xff0c;GPU为1080 Ti 限制最高功率效果 不限制最高功率(默认最高功率250W)&#xff1a;最高温度85&#xff0c;大多时间在75-85之间 将最高功率限制为150W&#xff1a;最高…

优维“统一开放平台”:开放、开发、集成、客制化

基于丰富完善的产品体系&#xff0c;优维重磅推出了统一开放平台。这款由优维自主设计与研发&#xff0c;集数据开发、能力开放、能力集成、客制化为一体的统一开放平台&#xff0c;具备应用市场、应用开发、连接能力、采控平台、API集市、开发者工具等功能模块&#xff0c;可为…

后端加前端Echarts画图示例全流程(折线图,饼图,柱状图)

本文将带领读者通过一个完整的Echarts画图示例项目&#xff0c;演示如何结合后端技术&#xff08;使用Spring Boot框架&#xff09;和前端技术&#xff08;使用Vue.js或React框架&#xff09;来实现数据可视化。我们将实现折线图、饼图和柱状图三种常见的数据展示方式&#xff…