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

求助:基于DFS算法优化灌溉渠系统,最大化水源覆盖节点数

灌溉渠网络优化问题

官方任务说明

灌溉渠是古埃及农业繁荣的关键创新。本问题将埃及灌溉渠系统表示为无向图,节点对应渠网枢纽,边对应实际水渠。
为便于水流控制,图中不能存在环,即该图为森林(不一定连通,可能包含孤立节点)。
部分节点为水源节点,需重新设计渠网,最大化通过水渠连接到至少一个水源的枢纽数量,即最大化包含至少一个水源节点的连通分量总规模。
每次改进操作需选择一个枢纽支点(pivot junction)(不能是孤立节点),拆除其一条水渠,新建一条连接到其他节点的水渠,总水渠数不变,且操作后图仍为森林。每个节点最多被改进操作触及一次。
目标是找到满足条件的改进序列,实现最大水源覆盖节点数。

输入格式

第一行是测试用例数T,每个测试用例包含:

  • 第一行三个整数N(枢纽数)、M(水渠数)、K(水源数)
  • 接下来M行,每行两个整数表示相连的枢纽
  • 最后一行K个不同的水源节点编号

输出格式

每个测试用例输出Case #t:,后跟S(最终连接水源的节点数)和P(改进次数),再输出P行改进操作,每行三个整数a_i(枢纽支点)、b_i(拆除连接的节点)、c_i(新建连接的节点)。

示例输入

2
3 1 1
0 2
1
6 3 1
1 2
3 4
4 5
0

示例输出

Case #0: 2 1
0 2 1
Case #1: 4 2
2 1 5
4 3 0

我的问题

我已经完成了Python脚本的输入解析部分,将数据存入DFSGraph类,但卡在核心逻辑实现:如何通过合法的改进操作最大化连接水源的节点数,请求帮助完成这部分代码。

inputFile = open("subtask-1-input.txt", "r")
inputFileLines = enumerate(inputFile.read().split("\n"))

# 
# Final values needed
# 
amountTestCases = None;
irrigations = []

# 
# Temp vars
# 
tempIrrigation = []
tempCanalsCount = None;
tempCanalConnections = []

tempBlockedIndexes = []

#
# Input file parser
# 
for index, line in inputFileLines:
  if index == 0:
    amountTestCases = int(line.split()[0])
    continue

  # N, M, K line
  if len(tempIrrigation) == 0:
    [junctions, canals, watersources] = map(int, line.split())
    tempCanalsCount = canals
    tempIrrigation.extend([junctions, canals, watersources])
    continue
  
  # Canal connections
  if len(tempIrrigation) == 3:
    if(tempCanalsCount != 0):
      tempCanalConnections.append(list(map(int, line.split())))
      tempCanalsCount -= 1
      continue
    else:
      tempIrrigation.append(tempCanalConnections)

  # Watersource indexes line at the end of each test case
  tempIrrigation.append(list(map(int, line.split())))

  irrigations.append(tempIrrigation)

  # Clean up temporary variables
  tempCanalsCount = None
  tempIrrigation = []
  tempCanalConnections = []

# 
# DFS class
# 
class DFSGraph():
  def __init__(self):
    self.graph = {}

  def add_edge(self, u, v):
    if u not in self.graph:
      self.graph[u] = []
    if v not in self.graph:
      self.graph[v] = []
    self.graph[v].append(u)
    self.graph[u].append(v)

# 
# Recursive improvement function
# 
def improve(prev, arr, graph):
  print("Hey")

# 
# Insert data points into DFS graph
# 
for index, irrigation in enumerate(irrigations):
  [junctions, canals, watersources, canalConnections, waterSourceIndexes] = irrigation
  dfs = DFSGraph()

  # Add canal connections to dfs graph
  for conn in canalConnections:
    dfs.add_edge(conn[0], conn[1])

  print(irrigation)
  print(dfs.graph)

  # Sort graph by size of value array
  sorted_key_list = sorted(dfs.graph, key=lambda key: len(dfs.graph[key]))
  sorted_dict = { key: dfs.graph[key] for key in sorted_key_list }

  print(sorted_dict)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:14:50