一.连通分量着色法
用于标记不同的联通分量以及节点个数
vector<int> colors(n, -1); // 初始颜色都为-1
int color = 0;
for (int i = 0; i < n; ++i) {
if (colors[i] == -1) { // 遇到未访问的节点
dfs(graph, colors, i, color); // DFS标记整个连通分量
color++; // 下一个颜色
}
}
vector<int> colorCount(color, 0);//每个连通分量(一种颜色)的节点个数
for (int c : colors) {
colorCount[c]++;
}
二.三色法判环法
色法判断环的原理是基于深度优先搜索(DFS)的标记策略,通过三种颜色标记节点的状态,以高效检测有向图中是否存在环。
使用拓扑排序也可以检验有没有环,如果一个有向图经过一次拓扑遍历后仍然由节点未被访问,说明有环
核心思想
颜色标记
为每个节点赋予三种状态(颜色):
白色(0):节点未被访问。
灰色(1):节点正在被访问(位于递归栈中)。
黑色(2):节点已完全访问结束(所有邻接节点处理完毕)。
关键观察
如果在DFS过程中,遇到一个灰色节点,说明存在一条从当前节点到灰 色节点的后向边,该边形成环。
bool dfs(int node, vector<int>&color){
color[node] = 1 // 标记为访问中
for(int i=0;i<graph[node].size();i++){
int neighbor = graph[node][i];
if(color[neighbor]==0){
return dfs(neighbor,color);
}else if(color[neighbor]==1){
return true;
}
color[node] = 2; // 标记为已访问
return False;
}