树与图的存储-邻接表与邻接矩阵-深度广度遍历

news/2024/7/20 22:05:58 标签: 图论, 深度优先, 算法

全部代码

全部代码在github acwing 上
正在更新
https://github.com/stolendance/acwing
图论
欢迎star与fork

树与图的存储

无论是树 还是无向图
都可以看成有向图

有向图可以采用邻接矩阵与邻接表进行存储

邻接矩阵

邻接矩阵 采用矩阵存储,graph[i][j] 代表i到j边的权重
若之间没有边,则为INT_MAX
graph 设置成long long 以防 INT_MAX+l 变成负数
边的序号统一从1开始

typedef long long ll;
vector<vector<ll> > graph(n+1,vector<ll>(n+1,INT_MAX));
// 自己到自己为0
for(int i=1;i<n+1;i++) graph[i][i]=0;

邻接表

邻接表 每个点 用一个单链表 存储它的出边
在这里插入图片描述

个人喜欢使用vector实现邻接表


struct Edge
{
	int next;
	int val;
	Edge(int next_,int val_):next(next_),val(val_){;}
}
vector<vector<Edge> > vec(N+1); 

加入一个边。从2指向5 权重为8
vec[2].push_back(Node(5,8));

邻接表上的深度遍历

用一个vis 数组 表示该点是否被访问过

#include<iostream>
#include<vector>
using namespace std;
struct Edge
{
    int next;
    int val;
    Edge(int next_,int val_):next(next_),val(val_){;}
};

void dfs(vector<int> &vis,vector<vector<Edge> > &vec,int u)
{
    vis[u]=1;
    for(int i=0;i<vec[u].size();i++)
    {
        if(vis[u]==0) dfs(vis,vec,vec[u][i].next);
    }
}
int main()
{
    int N=10;// 10个节点
    vector<vector<Edge> > vec(N);

    // 加入一条 5->2 的边,权重为8
    vec[5].push_back(Edge(2,8));
    vector<int> vis(N);// 代表该点是否访问过
    dfs(vis,vec,0);

}

邻接表的广度遍历

使用一个队列 依次把一个点的队列加入
按顺序访问

#include<iostream>
#include<vector>
#include<map>
#include<queue>
using namespace std;
// https://www.acwing.com/problem/content/849/
struct Edge
{
    int next;
    int value;
    Edge(int next_,int value_):next(next_),value(value_){;}
};
void bfs(vector<vector<Edge> > &graph,vector<int> &vis)
{
    queue<int> ls;
    ls.push(1);
    vis[1]=1;
    while(ls.size()!=0)
    {
        int t=ls.front();
        ls.pop();
        cout<<t<<endl;
        for(int i=0;i<graph[t].size();i++)
        {
            if(vis[graph[t][i].next]==0)
            {
                ls.push(graph[t][i].next);
                vis[graph[t][i].next]=1;
            }
        }
    }
}

int main()
{
    int n=0,m=0;
    cin>>n>>m;
    vector<vector<Edge> > graph(n+1);
    vector<int> vis(n+1);
    for(int i=0;i<m;i++)
    {
        int a,b;
        cin>>a>>b;
        graph[a].push_back(Edge(b,1));
    }
    bfs(graph,vis);
}

http://www.niftyadmin.cn/n/281886.html

相关文章

IDEA2022版教程上()

0、前景摘要 0.1 概览 0.2 套课程适用人群 初学Java语言&#xff0c;熟悉了记事本、EditPlus、NotePad或Sublime Text3等简易开发工具的Java初学者熟练使用其他Java集成开发环境&#xff08;IDE&#xff09;&#xff0c;需要转向IDEA工具的Java工程师们关注IDEA各方面特性的J…

2 异或位运算大厂必刷题

文章目录 如何不用额外变量交换两个数一个数组中有一种数出现了奇数次&#xff0c;其他数都出现了偶数次&#xff0c;怎么找到并打印这种数怎么把一个int类型的数&#xff0c;提取出最右侧的1来怎么把一个int类型的数,获取位数为1的数量一个数组中有两种数出现了奇数次&#xf…

python实战应用讲解-【numpy数组篇】常用函数(十)(附python示例代码)

目录 Python Numpy MaskedArray.ravel()函数 Python Numpy MaskedArray.reshape()函数 Python Numpy MaskedArray.resize()函数 Python Numpy MaskedArray.std()函数 Python Numpy MaskedArray.sum()函数 Python Numpy MaskedArray.swapaxes()函数 Python Numpy MaskedA…

php+nginx部署wordpress,如何设置nginx配置文件

文章目录 摘要wordpress文章发布后&#xff0c;nginx报404解决方法处理 413 Request Entity Too Large最终的配置文件 摘要 本文是关于在CentOS上使用Nginx和PHP部署WordPress的指南。文章提供了一个Nginx配置文件示例&#xff0c;该示例包含了监听端口、网站域名、网站根目录…

RocketMQ的简单使用

大家好&#xff0c;我是Leo&#xff01;今天来和大家分享RocketMQ的一些用法。 领域模型介绍 Producer: 用于生产消息的运行实体。 Topic: 主题&#xff0c;用于消息传输和存储的分组容器。 MessageQueue: 消息传输和存储的实际单元容器。 Message: 消息传输的最小单元。 C…

学系统集成项目管理工程师(中项)系列16a_风险管理(上)

1. 风险的定义 1.1. 损失的不确定性 1.1.1. 狭义 1.2. 带来损失的可能性&#xff0c;也指可能获利的机会 1.2.1. 广义 1.3. 风险是一种不确定的事件或条件&#xff0c;一旦发生&#xff0c;就会产生积极或消极的影响 2. 性质划分 2.1. 纯粹风险 2.1.1. 只有损失可能性而…

【MATLAB数据处理实用案例详解(22)】——基于BP神经网络的PID参数整定

目录 一、问题描述二、算法仿真2.1 BP_PID参数整定初始化2.2 优化PID2.3 绘制图像 三、运行结果四、完整程序 一、问题描述 基于BP神经网络的PID控制的系统结构如下图所示&#xff1a; 考虑仿真对象&#xff0c;输入为r(k)1.0&#xff0c;输入层为4&#xff0c;隐藏层为5&…

Python3中for循环多个变量详解

for 循环用于迭代任何序列&#xff0c;从列表到元组再到字典。它甚至可以遍历一个字符串。 在同一行代码中同时对变量进行多次赋值&#xff0c;称为可迭代解包。 Python的 for 循环中&#xff0c;使用多个变量可以应用于列表或字典&#xff0c;但它不适用于一般错误。 字典中…