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

有向无权图生成树构建:供水网络连通方案求解咨询

解决方案分析与实现

可行方案:基于可达性的分量连接

你的第一种思路(用DFS/BFS处理可达性)是完全可行的,且是解决这个问题的最优方式。核心逻辑是:找到所有从水库(节点0)无法到达的节点集合,然后针对每个独立的「可达闭包分量」,只需要添加一条从0指向该分量内任意节点的边,就能让整个分量的所有节点通上水。

具体实现步骤

  1. 构建有向图邻接表:根据输入的节点数和已有边,创建存储有向边的邻接表。
  2. 标记0的可达节点:用BFS或DFS遍历从0出发能到达的所有节点,标记为已可达。
  3. 处理不可达节点的分量:
    • 维护一个visited数组,记录已处理过的不可达节点。
    • 遍历所有节点,若遇到未可达且未被处理的节点:
      • 新增一条0 → 该节点的边到结果列表。
      • 再次用BFS/DFS遍历该节点能到达的所有节点(原始图内),标记这些节点为已处理,避免重复添加边。
  4. 输出结果:得到的新增边列表就是满足要求的最少连接方案。

伪代码示例

def find_required_edges(N, P, edges):
    # 构建邻接表
    adj = [[] for _ in range(N+1)]  # 节点0到N
    for u, v in edges:
        adj[u].append(v)
    
    # 第一步:标记从0可达的节点
    reachable = [False]*(N+1)
    from collections import deque
    q = deque([0])
    reachable[0] = True
    while q:
        u = q.popleft()
        for v in adj[u]:
            if not reachable[v]:
                reachable[v] = True
                q.append(v)
    
    # 第二步:处理不可达的分量
    visited = [False]*(N+1)
    required_edges = []
    for u in range(N+1):
        if reachable[u] or visited[u]:
            continue
        # 新增0到u的边
        required_edges.append((0, u))
        # 标记u能到达的所有节点为已处理
        q = deque([u])
        visited[u] = True
        while q:
            node = q.popleft()
            for neighbor in adj[node]:
                if not visited[neighbor] and not reachable[neighbor]:
                    visited[neighbor] = True
                    q.append(neighbor)
    return required_edges

# 示例输入:N=4,P=2,已有边[(3,1), (2,1)]
print(find_required_edges(4, 2, [(3,1), (2,1)]))
# 输出:[(0,4), (0,2), (0,3)](或等价的分量连接方案)

不可行方案:套用MST算法

给所有边加权重1后跑MST的思路不成立,原因如下:

  • MST是针对无向图的算法,它保证的是所有节点之间无向连通,但我们的问题要求的是所有节点都能从0出发有向到达。无向边无法替代有向边的单向可达性,比如MST生成的无向边0-1,如果原始图中没有0→1的有向边,那么0依然无法到达1,更无法通过1到达2或3。
  • MST的核心是最小化边的总权重,但我们的问题本质是解决有向可达性,而非无向连通,两者的问题模型完全不同,因此MST无法适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:20:33