int to[MAXM]; int head[MAXN], tail[MAXN]; voidbuild(int n, int m){ static std::pair<int, int> edge[MAXM]; staticint cnt[MAXN]; for (int i = 1, u, v; i <= m; i++) { std::cin >> u >> v; edge[i] = {u, v}; cnt[u]++; } for (int i = 1; i <= n; i++) { cnt[i] += cnt[i - 1]; head[i] = cnt[i - 1] + 1; tail[i] = cnt[i]; } for (int i = 1; i <= m; i++) { to[cnt[edge[i].first]--] = edge[i].second; } }
另外,如果再写一个辅助结构体 Edge,便可以使用
for (auto& v : Edge{u}) 遍历点 u 的所有出边。
1 2 3 4 5
structEdge { int u; int* begin()const{return to + head[u];} int* end()const{return to + tail[u] + 1;} };