You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

判断给定图为欧拉图/半欧拉图:Python代码末尾判断逻辑失效求助

帮你搞定半欧拉图的判定问题

Hey there! 作为Python初学者碰到这种卡壳的情况太正常啦,别慌~先从半欧拉图的核心规则入手,再一步步补全你的代码。

首先明确半欧拉图的判定规则(无向图)

要判断一个无向图是不是半欧拉图(存在欧拉路径但不存在欧拉回路),必须同时满足两个条件:

  • 整个图是连通的(所有节点之间都能通过路径互相到达)
  • 图中恰好有2个奇数度的节点(度数=节点连接的边数)

补充:如果是0个奇数度节点,那是欧拉图(存在欧拉回路,也属于有欧拉路径,但通常半欧拉图特指只有路径没有回路的情况)

先分析你给出的图结构

先帮你算一下每个节点的度数:

graph = { 
    "1" : set(["2", "6"]),  # 度数2(偶)
    "2" : set(["1", "6", "7", "3"]),  # 度数4(偶)
    "3" : set(["2","7","4", "5"]),  # 度数4(偶)
    "4" : set(["3", "5"]),  # 度数2(偶)
    "5" : set(["3","4", "7", "6"]),  # 度数4(偶)
    "6" : set(["1","2", "7", "5"]),  # 度数4(偶)
    "7" : set(["2", "3", "5"]),  # 度数3(奇)
}

这里有个小问题:无向图的总度数一定是偶数(每条边被两个节点各算一次),但你这个图的总度数是 2+4+4+2+4+4+3=23(奇数),说明图的边可能写错了?比如节点7是不是漏了一个邻居?不过没关系,咱们先把代码逻辑写对,图的问题你可以自己调整~

补全你的代码,实现判定逻辑

你的path函数看起来是用来做深度优先搜索(DFS)判断连通性的,我帮你补全并搭配完整的判定流程:

步骤1:实现DFS遍历,判断图是否连通

这个函数会遍历从起始节点出发能到达的所有节点,标记到visited集合里:

def dfs(graph, node, visited):
    visited.add(node)
    # 遍历当前节点的所有邻居
    for neighbor in graph[node]:
        if neighbor not in visited:
            dfs(graph, neighbor, visited)

def is_connected(graph):
    if not graph:
        return True
    # 取第一个节点作为起始点
    start_node = next(iter(graph.keys()))
    visited = set()
    dfs(graph, start_node, visited)
    # 如果所有节点都被访问到,说明图是连通的
    return len(visited) == len(graph)

步骤2:统计奇数度节点的数量

def count_odd_degree_nodes(graph):
    count = 0
    for node in graph:
        degree = len(graph[node])
        if degree % 2 != 0:
            count += 1
    return count

步骤3:最终判定是否为半欧拉图

def is_semi_eulerian(graph):
    if not is_connected(graph):
        return False
    odd_count = count_odd_degree_nodes(graph)
    # 半欧拉图需要恰好2个奇数度节点
    return odd_count == 2

测试一下

我调整了你的图,让它符合无向图的合法性(总度数为偶数,且有2个奇数度节点):

# 调整后的合法无向图(两个奇数度节点:5和6)
graph_fixed = { 
    "1" : set(["2", "6"]),
    "2" : set(["1", "6", "7", "3"]),
    "3" : set(["2","7","4", "5"]),
    "4" : set(["3", "5"]),
    "5" : set(["3","4", "6"]),  # 度数3(奇)
    "6" : set(["1","2", "5"]),  # 度数3(奇)
    "7" : set(["2", "3"]),  # 度数2(偶)
}

print(is_semi_eulerian(graph_fixed))  # 输出True,符合半欧拉图条件

给初学者的小提示

  • 写图相关的代码时,先确认图的合法性(无向图总度数为偶数),避免因为输入错误导致逻辑混乱
  • 连通性判断除了DFS,也可以用BFS(广度优先搜索),逻辑类似,只是遍历顺序不同
  • 如果是有向图,半欧拉图的判定规则不一样,不过看你的图结构应该是无向图,所以就不展开啦

内容的提问来源于stack exchange,提问作者teddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:02:43