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

相关推荐
微刻时光1 小时前
影刀RPA实战:爬取网站小说章节写入TXT文件
笔记·爬虫·python·自动化·rpa·影刀·影刀rpa
夜流冰2 小时前
Python - HTTP servers
python
小冉在学习2 小时前
leetcode 刷题day37动态规划Part06背包问题( 322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包)
算法·leetcode·动态规划
Ambition_LAO2 小时前
BERT--详解
python·bert
我狠狠地刷刷刷刷刷3 小时前
最长子字符串的长度(一)
数据结构·算法
人才程序员3 小时前
CSP-J/S 复赛算法 并查集-Hash表
c语言·c++·算法·青少年编程·哈希算法·竞赛·csp
不修×蝙蝠3 小时前
八大排序--07归并排序
数据结构·算法·排序算法
学编程的小鬼3 小时前
排序--DS
java·算法·排序算法
绎岚科技3 小时前
深度学习中的结构化概率模型 - 推断和近似推断篇
人工智能·深度学习·算法·机器学习