判断二分图

二分图是指无向图中可以将顶点分成两部分,使得每条边连接不同部分的顶点。通过染色法可以判断一个图是否为二分图,使用DFS进行颜色染色,若发现相同颜色的相邻节点则说明不是二分图。提供的代码实现了一个检查二分图的算法,其时间复杂度为O(n+m),其中n是节点数,m是边数。
摘要由CSDN通过智能技术生成

什么是二分图

如果一个无向图? 能够将顶点被划分为两瓣 ,且每一瓣中的顶点都没有边,即为二分图。
也就是说,二分图一定不存在奇数条边的连通图。

如何证明一个图是二分图

染色法,用bfs或者dfs来给每一个点染色,如果遇到了下一个点的颜色等于这一个点的颜色,即可确定这不是一个二分图。

代码

参考y总的dfs模板

时间复杂度是 O(n+m)O(n+m), nn 表示点数,mm 表示边数  
int n;      // n表示点数  
int h[N], e[M], ne[M], idx;     // 邻接表存储图  
int color[N];       // 表示每个点的颜色,-1表示未染色,0表示白色,1表示黑色  
  
// 参数:u表示当前节点,c表示当前点的颜色  
bool dfs(int u, int c)  
{  
    color[u] = c;  
    for (int i = h[u]; i != -1; i = ne[i])  
    {  
        int j = e[i];  
        if (color[j] == -1)  
        {  
            if (!dfs(j, !c)) return false;  
        }  
        else if (color[j] == c) return false;  
    }  
  
    return true;  
}  
  
bool check()  
{  
    memset(color, -1, sizeof color);  
    bool flag = true;  
    for (int i = 1; i <= n; i ++ )  
        if (color[i] == -1)  
            if (!dfs(i, 0))  
            {  
                flag = false;  
                break;  
            }  
    return flag;  
}  
  
作者:yxc  
链接:https://www.acwing.com/blog/content/405/  
来源:AcWing  
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值