Graph 感悟
感悟:
遍历图上的点先想到宽度优先搜索, 有很多模板
- 关于图的: 都是宽度优先遍历, 只是对遍历又稍微加了点条件----用hashMap, [ ] ? [ ] [ ], ArrayList[] ? 来存储对应的条件, 对入队的点判断是否满足该条件,进行存储.
- 简单图求最短路用宽度优先搜索
- 关于找所有的情况: 一般用深度优先搜索
- 有向图: 入度和边, 用什么容器, 怎么生成图, 根据什么入队, 出队后怎么遍历其他的边, 并判断入队
- 题意的分解:拓扑排序,BFS
5.9:
图、节点
- ---.next = -----复制的时候看看是否为空
- Copy的题看看是否需要hashmap, 存储—可以用来复制, 也可以用来判断containsKey
- 宽度优先搜素用队列或者whileloop---根据size判断, 或者剪枝加叶法, 判断叶结点的个数
- 图上的搜索或树上的搜索关于枝叶的用bfs—剪枝加叶法,主要是节点, 节点的邻居, 节点的支数., 主要借助两个容器: 看节点的邻居是否已经表示出来:
- hashmap 存节点(节点的邻居已经在节点的类中了)和支数(遍历节点和节点的邻居存支数), 遍历节点并判断支数借助队列存叶节点数, 宽度优先搜索----不断对poll出来的叶结点的所有邻居遍历->在map里面剪枝, 并判断是否生成新的叶结点并入队.并依次在结果list里面加入poll出来的叶结点 Topological Sorting
- 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 宽度搜索剪枝加叶.
画图是一个回溯的过程:
- 元素、容器、pos(看能不能用重复元素)helper(s, list, res, 0)
- 结果之一是否要求有序: Arrays.sort(candidates);
- 什么时候添加进res, 无重复(!res.contains())、pos >= s.length()、remainder == 0、随递归改变的变量
- 从哪个位置开始遍历元素结果之一是否重复(i= 0 or i = pos), 什么时候不符合直接continue(题目会给)。 符合要求的加入list, 下一步递归(pos = i, or i+ 1, 看是否能重复), 下一步回溯删掉最后一个元素