图论:染色法相关算法

一.连通分量着色法

用于标记不同的联通分量以及节点个数

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值