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, 看是否能重复), 下一步回溯删掉最后一个元素

 

posted @ 2017-07-23 20:28  apanda009  阅读(147)  评论(0编辑  收藏  举报