voidadd(int u, int v, int w){ E.push_back({ u, v, w }); } boolfindedge(int u0, int v0){ for (auto [u,v,w] : E) if (u == u0 && v == v0) return1; return0; } voiddfs(int u){ if (vis[u]) return; vis[u] = 1; for (auto e : E) if (e.u == u) dfs(e.v); }
查询边Θ(m),遍历某点的出边Θ(m),遍历图Θ(nm),空间Θ(m)。
邻接矩阵
1 2 3 4 5 6 7 8
bool E[N][N]; // Adjacency Matrix voidadd(int u, int v, int w){ E[u][v] = w; } boolfindedge(int u, int v){ return E[u][v]; } voiddfs(int u){ if (vis[u]) return; vis[u] = 1; for (int v = 1; v <= n; ++v) if (E[u][v]) dfs(v); }
查询边Θ(1),遍历某点的出边Θ(n),遍历图Θ(n2),空间Θ(n2)。
查询操作是Θ(1) 的;
不适用于重边不可忽略的情况;
空间较大;
在稀疏图上效率低。
邻接表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
structEdge { int v, w; }; vector<Edge> E[N];
voidadd(int u, int v, int w){ E[u].push_back({ v, w }); } boolfindedge(int u0, int v0){ for (auto [v,w] : E[u0]) if (v == v0) return1; return0; }
voiddfs(int u){ if (vis[u]) return; vis[u] = 1; for (auto e : E[u]) dfs(e.v); }
// Chain Forward Star structEdge { int nxt, to, w; }; vector<Edge> E; int head[N]; inlinevoidadd(int u, int v, int w){ E.push_back({ head[u], v, w }); head[u] = E.size() - 1; } boolfindedge(int u, int v){ for (int i = head[u]; i >= 1; i = E[i].nxt) if (E[i].to == v) return1; return0; } voiddfs(int u){ if (vis[u]) return; vis[u] = true; for (int i = head[u]; i >= 1; i = E[i].nxt) dfs(E[i].to); } voideachT(){ E.push_back({ -1,0,0 }); for(;;) { add(u, v, w) }; }