• Graph 感悟


    感悟:

    遍历图上的点先想到宽度优先搜索, 有很多模板

    1. 关于图的: 都是宽度优先遍历, 只是对遍历又稍微加了点条件----用hashMap, [ ] ? [ ] [ ], ArrayList[] ?  来存储对应的条件, 对入队的点判断是否满足该条件,进行存储.
    2. 简单图求最短路用宽度优先搜索
    3. 关于找所有的情况: 一般用深度优先搜索
    4. 有向图: 入度和边, 用什么容器, 怎么生成图, 根据什么入队, 出队后怎么遍历其他的边, 并判断入队
    5. 题意的分解:拓扑排序,BFS

    5.9:

    图、节点

    1. ---.next = -----复制的时候看看是否为空
    2. Copy的题看看是否需要hashmap, 存储—可以用来复制, 也可以用来判断containsKey
    3. 宽度优先搜素用队列或者whileloop---根据size判断, 或者剪枝加叶法, 判断叶结点的个数
    4. 图上的搜索或树上的搜索关于枝叶的用bfs—剪枝加叶法,主要是节点, 节点的邻居, 节点的支数., 主要借助两个容器:  看节点的邻居是否已经表示出来:
    5. hashmap 存节点(节点的邻居已经在节点的类中了)和支数(遍历节点和节点的邻居存支数), 遍历节点并判断支数借助队列存叶节点数, 宽度优先搜索----不断对poll出来的叶结点的所有邻居遍历->在map里面剪枝, 并判断是否生成新的叶结点并入队.并依次在结果list里面加入poll出来的叶结点 Topological Sorting
    6. list<set<>> 每个set的序列当作节点(先生成存储在list里的各个set), set的内容存节点的相邻点(for (int[] edge : edges) {

    adj.get(edge[0]).add(edge[1]); adj.get(edge[1]).add(edge[0]);  }), set的size==1当作叶节点的判断标准.加入节点存储器list中,  用while-loop 控制非叶结点的数量, 在loop里对所有的叶结点的所有邻居(int j = adj.get(i).iterator().next();)遍历-> 剪枝(dj.get(j).remove(i);), 并判断邻居是否符合叶结点的标准—set.size->加入新的叶结点集合, 最后剩下的是最里面的节点: Minimum Height Trees

    dfs

    如果只找一条确定的路径的话, 多是用bfs 宽度搜索剪枝加叶.

    画图是一个回溯的过程:

    1. 元素、容器、pos(看能不能用重复元素)helper(s, list, res, 0)
    2. 结果之一是否要求有序: Arrays.sort(candidates);
    3. 什么时候添加进res, 无重复(!res.contains())、pos  >= s.length()、remainder == 0、随递归改变的变量
    4. 从哪个位置开始遍历元素结果之一是否重复(i= 0 or i = pos), 什么时候不符合直接continue(题目会给)。 符合要求的加入list, 下一步递归(pos = i, or i+ 1, 看是否能重复), 下一步回溯删掉最后一个元素

  • 相关阅读:
    Collection集合总结
    JAVA泛型通配符T,E,K,V区别,T以及Class,Class的区别【转】
    Runnable和Thread
    jdk自带的函数式接口(配合lambda使用)
    java8-接口的静态方法(static)和默认方法(default)
    Java 8
    java8-Stream流【转】
    java8-lambda表达式
    Oracle:ORA-01461报错
    ASP.NET Core 入门笔记2,建立项目
  • 原文地址:https://www.cnblogs.com/apanda009/p/7225954.html
Copyright © 2020-2023  润新知