邻接表表示法 无权
// 邻接表(适用于一般树和图)
const int MAXN = 1e5 + 5;
vector<vector<int>> family(MAXN); // 存储每个节点的子节点
// 添加边
void addEdge(int u, int v) {
adj[u].push_back(v);
// 如果是无向图/树,还需要:
// adj[v].push_back(u);
}
链式向前星 带权
// 链式前向星(常用于有权树/图)
struct Edge {
int to, weight, next;
} edges[MAXN * 2]; // 对于树,边数为n-1,但通常预留更多空间
int head[MAXN], tot = 0;
void addEdge(int u, int v, int w) {
edges[tot].to = v;
edges[tot].weight = w;
edges[tot].next = head[u];
head[u] = tot++;
}
数组表示 适合堆和完全二叉树
// 堆的数组表示
const int MAXN = 1e5 + 5;
int heap[MAXN];
int heapSize = 0;
// 获取相关节点的索引
int parent(int i) { return (i - 1) / 2; }
int leftChild(int i) { return 2 * i + 1; }
int rightChild(int i) { return 2 * i + 2; }