染色法判断是否为二分图
二分图一定不存奇边环
初始化颜色数组(用0代表未被染色,用1表示其中一种颜色,用2代表其中另一种颜色)
遍历节点(从第一个点开始),如果该点为被染色,则将其染成第一种颜色并且将相邻的点染成另外一种颜色
如果相邻边已经染了色并且和该点颜色(A)相同,或者给相邻边染另外一种颜色(B)但给相邻边的相邻边染色(A)失败,则该图不是二分图
# 二分图一定不存在奇边环
from collections import defaultdict
# n点的数量,m边的数量
n, m = [int(x) for x in input().split(" ")]
# 存储图
dd = defaultdict(set)
# color 染色数组
color = [0] * (n + 1)
for _ in range(m):
a, b = [int(x) for x in input().split(" ")]
dd[a].add(b)
dd[b].add(a)
def dfs(u, c):
color[u] = c
for node in dd[u]:
if not color[node]:
if not dfs(node, 3 - c):
return False
elif color[node] == c:
return False
return True
flag = True
for i in range(1, n + 1):
if not color[i]:
if not dfs(i, 1):
flag = False
break
print(flag)
"""
IN:
4 4
1 3
1 4
2 3
2 4
OUT:
True
"""
最后更新于
这有帮助吗?