DFS框架
vector<int> G[maxn] // 图
int vis[maxn] // 访问节点标志
void dfs(int u) {
vis[i] = 1;
previsit(u); // 访问节点 u 之前的操作
int d = G[u].size();
for(int i = 0; i < d; i++) { // 枚举每条边
int v = G[u][i];
if(!vis[v]) dfs(v);
}
posvisit(u); // 访问节点 u 之后的操作
tarjian 算法基本全是 DFS 框架。
求强连通分量,LCA等。
染色法判二分图
int color[maxn];
// 判断节点 u 所在的连通分量是否为二分图
bool bipartite(int u) {
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i]; // 枚举每条边 (u, v)
if(color[v] == color[u]) return false;
// 节点 v 已经着色,且和节点 u 颜色冲突
if(!color[v]) {
color[v] = 3 - color[u];
if(!bipartite(v)) return false;
}
}
return true;
}
用颜色 1 和 2表示黑色和白色,0 表示没着色,则 vis 数组就没有存在必要,调用之前要把 color 初始化为 0.