二分图染色(DFS框架)

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值