python 实现DFS判断是否是二分图Bipartite算法

DFS(深度优先搜索)算法可以用来判断一个图是否为二分图。在图论中,二分图是指一个图的所有节点可以分成两个不相交的集合,使得同一集合中的节点不相连。使用DFS算法判断二分图的基本思想是:从图中任一节点开始,尝试将节点染成两种颜色之一(通常是0和1),并递归地对每个节点的相邻节点进行染色,确保相邻节点颜色不同。如果在染色的过程中发现某个节点已经被染上了与当前应染颜色相同的颜色,则说明该图不是二分图。

以下是DFS算法判断二分图的详细步骤和关键点:

初始化:

创建一个数组colors,用于记录每个节点的颜色,初始时所有节点的颜色设为未定义(如-1)。

创建一个访问数组visited,用于记录节点是否被访问过,初始时所有节点都未被访问。

DFS函数:

输入参数包括当前节点v、当前颜色c(0或1)、图的表示graph(如邻接表)。

将当前节点v的颜色设为c,并标记为已访问。

遍历当前节点v的所有邻接节点w:

如果w未被访问,则递归调用DFS函数,将w染成与v相反的颜色(如果v是0,则w是1,反之亦然)。

如果w已被访问且颜色与v相同,则说明图不是二分图,返回失败。

主函数:

遍历图中的每个节点,如果节点未被访问,则调用DFS函数开始染色过程。

如果在DFS过程中没有返回失败,则说明图是二分图。

以下是DFS判断二分图的伪代码示例:

python 复制代码
def dfs(graph, v, color, colors, visited):
    colors[v] = color
    visited[v] = True
    for neighbor in graph[v]:
        if not visited[neighbor]:
            if not dfs(graph, neighbor, 1 - color, colors, visited):
                return False
        elif colors[neighbor] == color:
            return False
    return True

def isBipartite(graph):
    V = len(graph)
    colors = [-1] * V
    visited = [False] * V

    for i in range(V):
        if not visited[i] and not dfs(graph, i, 0, colors, visited):
            return False
    return True

注意:在实际编程中,图的表示方式(如邻接表、邻接矩阵等)和具体的DFS实现可能有所不同,但基本思路是一致的。

另外,需要注意的是,DFS算法的时间复杂度是O(V+E),其中V是节点数,E是边数,因为它需要访问图中的每个节点和每条边。## DFS判断是否是二分图Bipartite算法

DFS判断是否是二分图Bipartite算法python实现样例

以下是使用DFS判断是否是二分图的算法实现:

python 复制代码
def is_bipartite(graph):
    n = len(graph)
    color = [-1] * n

    def dfs(node, c):
        color[node] = c
        for neighbor in graph[node]:
            if color[neighbor] == c:
                return False
            if color[neighbor] == -1 and not dfs(neighbor, 1 - c):
                return False
        return True

    for i in range(n):
        if color[i] == -1:
            if not dfs(i, 0):
                return False
    return True


# 测试样例
graph = [[1, 3], [0, 2], [1, 3], [0, 2]]
print(is_bipartite(graph))  # 输出True

graph = [[1, 2, 3], [0, 2], [0, 1, 3], [0, 2]]
print(is_bipartite(graph))  # 输出False

该算法使用DFS遍历图中的每个节点,并为每个节点赋予一个颜色值,如果在DFS过程中发现两个相邻节点拥有相同的颜色,则表示图不是二分图,否则是二分图。

相关推荐
看海天一色听风起雨落17 分钟前
Python学习之装饰器
开发语言·python·学习
XiaoMu_0011 小时前
基于Python+Streamlit的旅游数据分析与预测系统:从数据可视化到机器学习预测的完整实现
python·信息可视化·旅游
THMAIL1 小时前
深度学习从入门到精通 - 生成对抗网络(GAN)实战:创造逼真图像的魔法艺术
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·cnn
bkspiderx1 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
我没想到原来他们都是一堆坏人2 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
中华小当家呐2 小时前
算法之常见八大排序
数据结构·算法·排序算法
总有刁民想爱朕ha3 小时前
车牌模拟生成器:Python3.8+Opencv代码实现与商业应用前景(C#、python 开发包SDK)
开发语言·python·数据挖掘
沐怡旸3 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试
一只懒洋洋3 小时前
K-meas 聚类、KNN算法、决策树、随机森林
算法·决策树·聚类
人衣aoa4 小时前
Python编程基础(八) | 类
开发语言·python