首先学习三种存图方式
约定 n 为点数,m 为边数
- 邻接表
与数组存储单链表的实现一致(头插法)
「稀疏图」:m≈n
int[] he = new int[N], e = new int[M], ne = new int[M], w = new int[M];
//idx表示当前边的下标
int idx;
//a节点指向b节点,权重为c
void add(int a, int b, int c) {
e[idx] = b; //e数组存储当前边指向的节点
w[idx] = c; //w数组存储当前节点的权重
ne[idx] = he[a]; //ne数组用于找到下一条边
he[a] = idx; //he数组存储当前边所对应边的集合(链表)的头节点
idx++;
}
//遍历所有由 a 点发出的边
for (int i = he[a]; i != -1; i = ne[i]) {
int b = e[i], c = w[i];
}
- 邻接矩阵
二维矩阵来进行存图
「稠密图」: m≈n²
// 邻接矩阵数组:w[a][b] = c 代表从 a 到 b 有权重为 c 的边
int[][] w = new int[N][N];
// 加边操作
void add(int a, int b, int c) {
w[a][b] = c;
}
- 类