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过程中发现两个相邻节点拥有相同的颜色,则表示图不是二分图,否则是二分图。

相关推荐
0566468 分钟前
Python高级——解释器执行原理与虚拟环境工程化实战
开发语言·python
weixin_435776119 分钟前
2026年长沙托育vi设计从风格定位到元素运用的设计方法
linux·运维·服务器·python
梦想三三12 分钟前
LangChain RAG PDF 智能问答实战:用 Streamlit 构建本地知识库(完整代码)
人工智能·python·langchain·大模型·rag
星轨初途27 分钟前
LeetCode 热题 100——day2 字母异位词分组
c++·算法·leetcode
happyprince40 分钟前
篇1:整体观 · bitsandbytes项目全貌解读
人工智能·算法
电化学仪器白超1 小时前
禹衡光栅长度计精度评测:基于国标0级氧化锆量块的校正与数据分析
python·单片机·嵌入式硬件·物联网·自动化
青梅橘子皮1 小时前
STL---map/set... “家族“详解(从使用到底层)(1)
数据结构·算法
让学习成为一种生活方式1 小时前
DNA 甲基化综述(模式、调控与功能)--Current Opinion in Plant Biology
算法
小玮看世界1 小时前
[Python]自动驾驶感知与决策练习题 (1-10)
开发语言·python·自动驾驶
Ming_studying1 小时前
Python + SQLite FTS5 构建本地文档全文搜索器:增量索引、中文检索与高亮
jvm·数据库·python·sqlite