数据结构(图)算法简略记录
1、引言
图是树的升级版(树是相连无相无环图)
- 有向图
- 无向图
- 有循环
- 无循环
- 所有节点相连
- 所有节点不相连
图通常有两种表示方法,假设图中有n个节点,m条边
- 邻接矩阵:
- 建立一个 n x n矩阵G,如果第i个节点连向第j个节点,则G[i][j]=1,反之为0
- 如果图是无向的,则该邻接矩阵一定是对称矩阵,即G[i][j]=G[j][i]
- 邻接链表:
- 建立一个大小为n的数组,每个位置i储存一个数组或链表,表示第i个节点连向其他节点
- 邻接矩阵 比 邻接链表 空间开销大,但是支持快速查找 i 和 j 是否相连
2、二分图
二分图算法也称为染色法,是一种广度优先搜索
- 若可以用两种颜色对图中的节点进行着色,并且保证相邻的节点颜色不同,那么图为二分
- 特点:所有点将被分成独立的集合;每条边两端的点一定属于不同集合;可能存在孤点
解题思路
- 将判断是否为二分图转换为给图上色
- 进行遍历,判断当前顶点的邻点是否上色;是否与当前顶点的颜色相同
Java解答
// 深度遍历
class Solution {
public static final int UNCOLORED = 0;
public static final int RED = 1;
public static final int GREEN = 2;
private int[] color;
private boolean valid;
public boolean isBipartite(int[][] graph) {
int n = graph.length;
valid = true;
color = new int[n];
Arrays.fill(color, UNCOLORED);
for (int i = 0; i < n && valid; i++) {
if (color[i] == UNCOLORED) {
dfs(i, RED, graph);
}
}
return valid;
}
private vo