面试中常见的图论问题
[TOC]
二分图问题:
LeetCode 785. Is Graph Bipartite?
这是一个直白的二分图问题:二分图问题,就是可否将图的所有节点分成两个集合,有连边两个点不在一个集合。
将二分图问题可以看成二染色问题,即使用两种颜色对图进行染色,相连的两个点,颜色不能相同。
解决办法:遍历染色
DFS+染色:
1 | class Solution { |
也可以BFS+染色:
1 | public class Solution { |
这道题加了点丰富的背景,但是很容易看出来还是一个二分图问题。据说这道题是今年字节跳动的笔试题
多了一点构建图。
DFS+染色:
1 | public class Solution { |
拓扑排序问题
详细介绍见我这篇博客:BFS DFS 判断DAG(有向无环图)
这道题原先用Python写过。BFS+入度,和DFS暴力搜索两种,直接上java代码;
1 | class Solution { |
1 | public class Solution { |
这道拓扑排序,唯一的不同就是讲排序结果输出,用BFS+入度,再加个数组。
1 | class Solution { |
并查集检查冗余
并查集详细介绍:并查集原理及联通分量个数问题
注:并查集上的点至少有两个属性:(data, parent),其中指向parent,这种映射关系,完全可以用数组的index-value代替,故我们可以有两个数组 parent,rank(用于UF的优化,路径压缩等等),而data作为index存在,映射关系则用数组实现。
1 | class Solution { |
单纯的并查集问题
1 | class Solution{ |
图论还有最短路问题,网络流问题(这个面试应该不会问)等等。以后遇到了接着补充