图论笔记1

1.1邻接矩阵储存法

//创建:二维数组vector<vector<int>> graph(n,vector<int>(n,0));//储存for(int i=0;i<m;i++){int x1,x2;cin>>x1>>x2;graph[x1-1][x2-1]=1;}

1.2邻接表储存法

补充:c++中的list是链表 链接

//创建:数组+链表
vector<list<int>> graph(n + 1);//输入
while (m--) {cin >> s >> t;// 使用邻接表 ,表示 s -> t 是相连的graph[s].push_back(t);
}
//读取数据
if (result.size() == 0) cout << -1 << endl;for (const vector<int> &pa : result) {for (int i = 0; i < pa.size() - 1; i++) {cout << pa[i] << " ";}cout << pa[pa.size() - 1]  << endl;}

2.1 dfs

所有可达路径

dfs三部曲:
确认递归函数和参数、确认终止条件、处理目前搜索节点的出发路径(处理节点、dfs递归、回溯)

#include<iostream>
#include<vector>
using namespace std;vector<vector<int>> results;
vector<int> result;//1 确认递归函数参数: 邻接表,当前历遍节点,终点
void dfs(const vector<vector<int>>& graph,int x,int n){//2 确认终止条件:当当前节点x = 最后一个节点n,就是从起点到了终点if(x==n-1){results.push_back(result);//存入结果return;}//3、处理目前搜索节点的出发路径for(int i=0;i<n;i++){if(graph[x][i]){            //找到下一个节点result.push_back(i+1);  //处理节点dfs(graph,i,n);         //处理下一个节点result.pop_back();      //利用vector的性质回溯}}
}int main(){int n,m;cin>>n>>m;vector<vector<int>> graph(n,vector<int>(n,0));for(int i=0;i<m;i++){int x1,x2;cin>>x1>>x2;graph[x1-1][x2-1]=1;}result.push_back(1); //重要!先把开始节点放进去dfs(graph,0,n);if(results.size()==0)cout<<"-1"<<endl;for(int i=0;i<int(results.size());i++){for(int j=0;j<int(results[i].size()-1);j++){cout<<results[i][j]<<" ";}cout<<results[i][results[i].size()-1]<<endl;}}

要注意0的问题。(开辟n个位置从0-n-1,开辟n+1个位置从0-n)

#include<iostream>
#include<vector>
#include<list>
using namespace std;vector<vector<int>> results;
vector<int> result;//1 确认递归函数参数: 邻接表,当前历遍节点,终点
void dfs(const vector<list<int>>& graph,int x,int n){//2 确认终止条件:当当前节点x = 最后一个节点n,就是从起点到了终点if(x==n-1){results.push_back(result);//存入结果return;}//3、处理目前搜索节点的出发路径for(int i:graph[x]){            //找到下一个节点result.push_back(i+1);  //处理节点dfs(graph,i,n);         //处理下一个节点result.pop_back();      //利用vector的性质回溯}
}int main(){int n,m;cin>>n>>m;vector<list<int>> graph(n);for(int i=0;i<m;i++){int x1,x2;cin>>x1>>x2;graph[x1-1].push_back(x2-1);}result.push_back(1); //重要!先把开始节点放进去dfs(graph,0,n);if(results.size()==0)cout<<"-1"<<endl;for(int i=0;i<int(results.size());i++){for(int j=0;j<int(results[i].size()-1);j++){cout<<results[i][j]<<" ";}cout<<results[i][results[i].size()-1]<<endl;}}

岛屿问题99

#include<iostream>
#include<vector>
using namespace std;//1、确定参数
void dfs(const vector<vector<int>>& graph,vector<vector<int>>& visited, int x, int y){int dir[4][2]={0,1,  1,0,  -1,0,  0,-1};//2、终止条件(访问过了/周边都是0了,一条路就走完了)if(visited[x][y] || graph[x][y]==0) return;//3、处理当前点visited[x][y]=1;for(int i=0;i<4;i++){//上下左右四个位置,作用是感染同一岛屿的所有块(颜色填充也是这个原理)int newx=x+dir[i][0];int newy=y+dir[i][1];if(newx<0||newx>=int(graph.size())||newy<0||newy>=int(graph[0].size())) continue;dfs(graph,visited,newx,newy);}}int main(){int n,m;cin>>n>>m;vector<vector<int>> graph(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>graph[i][j];}}// for(int i=0;i<n;i++){//     for(int j=0;j<m;j++){//         cout<<graph[i][j]<<" ";//     }//     cout<<endl;// }vector<vector<int>> visited(n,vector<int>(m,0));int result=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(!visited[i][j] && graph[i][j]==1){dfs(graph,visited,i,j);result++;}}}cout<<result;
}

岛屿最大面积100

#include<iostream>
#include<vector>
using namespace std;//1、确定参数(注意!!这里visited和single想要被改变,要传入变量本身!要用&)
void dfs(const vector<vector<int>>& graph,vector<vector<int>>& visited,int x,int y,int& single){//2、停止条件if(graph[x][y]==0||visited[x][y]){return;}//3、处理当前节点single++;visited[x][y]=1;int dir[4][2]={0,-1,0,1,-1,0,1,0};for(int i=0;i<4;i++){int newx=x+dir[i][0];int newy=y+dir[i][1];if(newx<0||newx>=int(graph.size())||newy<0||newy>=int(graph[0].size())) continue;dfs(graph,visited,newx,newy,single);}
}int main(){int n,m;cin>>n>>m;vector<vector<int>> graph(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>graph[i][j];}}int result=0;vector<int> s;vector<vector<int>> visited(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(!visited[i][j] && graph[i][j]==1){int single=0;dfs(graph,visited,i,j,single);result=max(result,single);}}}cout<<result;}

2.2 最小生成树

prim

#include<iostream>
#include <vector>
#include <climits>
using namespace std;int main(){int v,e;cin>>v>>e;vector<vector<int>> graph(v+1,vector<int>(v+1,100001));while(e--){int x1,x2,val;cin>>x1>>x2>>val;graph[x1][x2]=val;//是无向图graph[x2][x1]=val;}//------------------检查用----------------------------// for(int i=1;i<=v;i++){//     for(int j=1;j<=v;j++){//         cout<<graph[i][j]<<" ";//     }//     cout<<endl;// }//----------------------------------------------------vector<int> minDist(v+1,100001);vector<int> intree(v+1,false);vector<int> arc(v+1);int start=-1;for(int count=1;count<v;count++){//循环n-1次//1、选距离生成树最近的节点,即更新startint min=INT_MAX;for(int i=1;i<=v;i++){if(!intree[i] && minDist[i]<min) {//这里是算生成树的每个节点与离它最近的树外节点的距离min=minDist[i];start=i;}}if(start==-1) {cout<<"-1"<<endl;return 0;}//把最近的节点加入生成树intree[start]=1;//------------------检查用----------------------------// for(int i=1;i<=v;i++){//     cout<<minDist[i]<<" ";// }// cout<<"###################"<<endl;//----------------------------------------------------//3、更新非生成树节点到生成树的距离,即minDist数组。并记录1中最短边,即更新arc数组for(int j=1;j<=v;j++){if(!intree[j] && graph[start][j]<minDist[j]){//只要一端在start,另一端不在树里,且值比当前位置值小的,都放进来minDist[j]=graph[start][j];arc[j]=start;}}//------------------检查用----------------------------// for(int i=1;i<=v;i++){//     cout<<minDist[i]<<" ";// }// cout<<"-------------------"<<endl;//----------------------------------------------------}int total=0;for(int i=2;i<=v;i++){total+=minDist[i];}cout<<total<<endl;
}

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

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

相关文章

GB28181系列三:GB28181流媒体服务器ZLMediaKit

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、ZLMediaKit介绍 二、 ZLMediaKit安装、运行(Ubuntu) 1、安装 2、运行 3、配置 三、ZLMediaKit使用 一、ZLMediaKit介绍 ZLMediaKit是一个基于C11的高性能运营级流媒体服务框架&#xff0c;项目地址&#xf…

iPhone恢复技巧:如何从 iPhone 恢复丢失的照片

在计算机时代&#xff0c;我们依靠手机来捕捉和存储珍贵的回忆。但是&#xff0c;如果您不小心删除或丢失了手机上的照片怎么办&#xff1f;这真的很令人沮丧和烦恼&#xff0c;不是吗&#xff1f;好吧&#xff0c;如果您在 iPhone 上丢失了照片&#xff0c;您不必担心&#xf…

如何将你的 Ruby 应用程序从 OpenSearch 迁移到 Elasticsearch

作者&#xff1a;来自 Elastic Fernando Briano 将 Ruby 代码库从 OpenSearch 客户端迁移到 Elasticsearch 客户端的指南。 OpenSearch Ruby 客户端是从 7.x 版 Elasticsearch Ruby 客户端分叉而来的&#xff0c;因此代码库相对相似。这意味着当将 Ruby 代码库从 OpenSearch 迁…

LeetCode 283.移动零(超简单讲解)

283.移动零 题目示例示例1示例2 解题思路快慢指针实现设计 详细代码 题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 示例1 …

Day8 神经网络中的导数基础

Day8 神经网络中的导数基础 导数的定义 导数&#xff08;Derivative&#xff09;是微积分中的一个核心概念&#xff0c;用于描述函数在某一点的变化率。简单来说&#xff0c;导数就是函数值随自变量微小变化而产生的变化量&#xff0c;即斜率或变化率。假设有一个函数 f ( x…

RequestContextHolder 与 HttpServletRequest 的联系

1. 什么是 RequestContextHolder&#xff1f; RequestContextHolder 是 Spring 框架 提供的一个工具类&#xff0c;用于在当前线程中存储和获取与请求相关的上下文信息。它是基于 ThreadLocal 实现的&#xff0c;能够保证每个线程独立存储和访问请求信息。 与 HttpServletReq…

SpringBoot配置和启动

1.内部配置加载顺序&#xff1a; 加载规则 加载顺序和优先级与配置文件所在路径有关优先级高的配置会覆盖优先级低的配置&#xff0c;配置文件会全部加载&#xff0c;遇到相同的配置高优先级覆盖低优先级命令行参数 -spring.config.location 自定义配置文件路径&#xff0c;可…

【视频生成模型】——Hunyuan-video 论文及代码讲解和实操

&#x1f52e;混元文生视频官网 | &#x1f31f;Github代码仓库 | &#x1f3ac; Demo 体验 | &#x1f4dd;技术报告 | &#x1f60d;Hugging Face 文章目录 论文详解基础介绍数据预处理 &#xff08;Data Pre-processing&#xff09;数据过滤 (Data Filtering)数据标注 (Data…

52 基于单片机的超声波、温湿度、光照检测分阶段报警

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 1.通过DHT11模块读取环境温度和湿度: 2.将湿度、障碍物距显示在lcd1602上面&#xff0c;第一行显示温度和湿度,格式为:xxCyy%&#xff0c;第二行显示超声波传感器测得的距离&#xff0c;格式为:Di…

大数据与AI:从分析到预测的跃迁

引言&#xff1a;数据时代的新纪元 从每天的社交分享到企业的运营决策&#xff0c;数据早已成为现代社会不可或缺的资源。我们正置身于一个数据爆炸的时代&#xff0c;数以亿计的信息流实时生成&#xff0c;为人类带来了前所未有的洞察能力。然而&#xff0c;数据的价值并不仅限…

3D视觉[一]3D计算机视觉

3D视觉[一]3D计算机视觉 3D计算机视觉概述 像机标定 文章目录 3D视觉[一]3D计算机视觉前言一、人类视觉二、计算机视觉2.1 计算机视觉的研究目的2.2 计算机视觉的研究任务2.3 计算机视觉的研究方法2.4 视觉计算理论2.5 马尔框架中计算机视觉表达的四个层次2.5.1 图像&#xff…

OpenCV目标检测 级联分类器 C++实现

一.目标检测技术 目前常用实用性目标检测与跟踪的方法有以下两种&#xff1a; 帧差法 识别原理&#xff1a;基于前后两帧图像之间的差异进行对比&#xff0c;获取图像画面中正在运动的物体从而达到目标检测 缺点&#xff1a;画面中所有运动中物体都能识别 举个例子&#xf…

QT从入门到精通(二) ——信号与槽机制

Qt 的信号与槽机制&#xff08;Signal and Slot&#xff09;是 Qt 框架 中用于对象间通信的核心机制之一。它允许对象之间进行松耦合的事件驱动式通信&#xff0c;尤其适合 GUI 应用程序 中的事件处理。 1. 基本概念 信号 (Signal) 当对象的状态发生变化时&#xff0c;它会发…

如何使用git新建本地仓库并关联远程仓库的步骤(详细易懂)

一、新建本地仓库并关联远程仓库的步骤 新建本地仓库 打开终端&#xff08;在 Windows 上是命令提示符或 PowerShell&#xff0c;在 Linux 和Mac上是终端应用&#xff09;&#xff0c;进入你想要创建仓库的目录。例如&#xff0c;如果你想在桌面上创建一个名为 “my - project”…

1Panel应用推荐:MaxKB开源知识库问答系统

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

element plus的table组件,点击table的数据是,会出现一个黑色边框

在使用 Element Plus 的 Table 组件时&#xff0c;如果你点击表格数据后出现了一个黑色边框&#xff0c;这通常是因为浏览器默认的焦点样式&#xff08;outline&#xff09;被触发了。如图&#xff1a; 你可以通过自定义 CSS 来隐藏这个黑色边框&#xff0c;代码如下&#xff1…

泷羽sec学习打卡-brupsuite7搭建IP炮台

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-Brup-IP炮台搭建 搭建炮台服务端安装zmap1、更新系统和安装基础依赖&#xff…

赫布定律 | 机器学习 / 反向传播 / 经验 / 习惯

注&#xff1a;本文为 “赫布定律” 相关文章合辑。 未整理。 赫布定律 Hebb‘s law 馥墨轩 2021 年 03 月 13 日 00:03 1 赫布集合的基本定义 唐纳德・赫布&#xff08;Donald Hebb&#xff09;在 1949 年出版了《行为的组织》&#xff08;The Organization of Behavior&a…

各个数据库优劣势对比

1.关系型数据库&#xff08;RDBMS&#xff09; 优势&#xff1a; • 数据一致性&#xff1a;通过严格的事务处理和ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;特性&#xff0c;确保数据的一致性和完整性。 • 易于理解和使用&#xff1a;关系型数据库的表结构…

Excel中如何消除“长短款”

函数微调可以可以实施&#xff0c;简单且易于操作的气球&#x1f388;涨缩更妙。 (笔记模板由python脚本于2024年12月17日 06:19:13创建&#xff0c;本篇笔记适合用Excel操作数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Fre…