邻接表的用法

简介: 邻接表的用法

邻接表是图的一种最主要存储结构,用来描述图上的每一个点。对图的每个顶点建立一个容器(n个顶点建立n个容器),第i个容器中的结点包含顶点Vi的所有邻接顶点。

  • 题目:6139. 受限条件下可到达节点的数目


现有一棵由 n 个节点组成的无向树,节点编号从 0 到 n - 1 ,共有 n - 1 条边。
给你一个二维整数数组 edges ,长度为 n - 1 ,
其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。
另给你一个整数数组 restricted 表示 受限 节点。
在不访问受限节点的前提下,返回你可以从节点 0 到达的 最多 节点数目。
注意,节点 0 不 会标记为受限节点。
  • 示例:


输入:n = 7, edges = [[0,1],[1,2],[3,1],[4,0],[0,5],[5,6]],
            restricted = [4,5]
输出:4
解释:上图所示正是这棵树。
在不访问受限节点的前提下,只有节点 [0,1,2,3] 可以从节点 0 到达。
  • 将restricted中的点转化为vis数组的已访问状态,建图然后通过BFS从0开始遍历图,统计入队节点数即为答案。
  • 示例中可以建立的邻接表如下:
[
[1,4,5],
[0,2,3],
[1],
[1],
[0],
[0,6],
[5]
]
  • 实现

class Solution {
    public int reachableNodes(int n, int[][] edges, int[] restricted) {
        // 邻接表的结构
        List<Integer>[] adj = new List[n];
        for (int i = 0; i < n; ++i){
            adj[i] = new ArrayList<>();
        }
        // 邻接表建图
        for (int i = 0; i < n - 1; ++i){
            adj[edges[i][0]].add(edges[i][1]);
            adj[edges[i][1]].add(edges[i][0]);
        }
        boolean[] vis = new boolean[n];
        // 处理restricted数组
        for (int num : restricted) vis[num] = true;
        Deque<Integer> q = new LinkedList<>();
        q.addLast(0);
        vis[0] = true;
        int ans = 1;
        while (!q.isEmpty()){
            // 尾部添加,头部读取,校验是否访问过
            int cur = q.pollFirst();
            for (int next : adj[cur]){
                if (!vis[next]){
                    q.addLast(next);
                    vis[next] = true;
                    ++ans;
                }
            }
        }
        return ans;
    }
}

参考链接:https://leetcode.cn/problems/reachable-nodes-with-restrictions/solution/by-darkbin-elga/

相关文章
|
9月前
|
存储 算法
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
|
10月前
|
存储 容器
图的存储结构之打印邻接表
图的存储结构之打印邻接表
88 0
|
存储
数据结构实验八 数组和广义表的基本操作及应用
数据结构实验八 数组和广义表的基本操作及应用
136 0
|
10月前
|
算法 C++
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
55 0
|
10月前
|
算法 Python
Python 数据结构和算法:解释深度优先搜索(DFS)和广度优先搜索(BFS)。
Python 数据结构和算法:解释深度优先搜索(DFS)和广度优先搜索(BFS)。
222 0
|
算法
【算法与数据结构】二叉树的三种遍历代码实现(下)—— 非递归方式实现(大量图解)
【算法与数据结构】二叉树的三种遍历代码实现(下)—— 非递归方式实现(大量图解)
98 0
|
C语言
【数据结构】二叉树的建立及先中后序遍历完整C语言代码
【数据结构】二叉树的建立及先中后序遍历完整C语言代码
494 0
二叉树转换双向循环链表
二叉树转换双向循环链表
74 0
|
存储 机器学习/深度学习 Java
数据结构(4)树形结构——二叉树(概述、前序、中序、后序、层序遍历JAVA实现)
4.1.树 树,由n(n≥0)个有限节点和边组成一个具有层次关系的数据结构。树需要满足以下条件: 任何结点的子节点不相交。 任何子结点只有一个父节点。 N个结点,N-1条边。 对于一个非空树(结点数≥0),具有以下性质: 起始结点称为“根” 除根结点外可分为m个互不相交的有限集合,其中每个集合本身也是一棵树,称为原来这棵树的“子树”。
172 0
|
机器学习/深度学习 C++ 容器
C++实现的二叉树创建和遍历,超入门邻家小女也懂了
C++实现的二叉树创建和遍历,超入门邻家小女也懂了
112 0

热门文章

最新文章