在一个地图上有n 个地窖(n≤200),每个地窖中埋有一定数量的地雷。
同时,给出地窖之间的连接路径,并规定路径都是单向的,且保证都是小序号地窖指向大序号地窖,也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径。
某人可以从任意一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。
设计一个挖地雷的方案,使他能挖到最多的地雷。
注意:数据保证挖到最多地雷的路线只有一条。
输入格式
第一行包含整数n,表示地窖的个数。
第二行包含n个整数,依次为每个地窖地雷的个数。
接下来若干行,每行包含两个整数xi,yi,表示从xi可到yi,xi<yi。
最后一行为”0”表示结束。
输出格式
第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个‘-’分隔,形如:k1−k2−…−kv。
第二行包含一个整数,表示能挖到的最多地雷数。
输入样例:
6
5 10 20 5 4 5
1 2
1 4
2 4
3 4
4 5
4 6
5 6
0 0
输出样例:
3-4-5-6
34
思路 :
两重循环进行dp即可 具体请看注释
n = int(input())
lst = [0] + list(map(int,input().split())) # 每个节点地雷数
Map = [[0 for i in range(n+1)]for j in range(n+1)] # 连通性
before = [0 for i in range(n+1)] # 储存每个节点的前驱节点
dp = [0 for i in range(n+1)]
din = [0 for i in range(n+1)] # 入度为0的点dp值已经确定
mx = 0 # 最大值
last_node = 0 # 最后一个节点
def Print(node,lst) : # 打印结果
if lst[node] == 0 :
print(node,end='')
return
Print(lst[node],lst)
print('-'+str(node),end='')
while 1 :
a,b = map(int,input().split())
if a == 0 and b == 0 :
break
Map[a][b] = 1
din[b] += 1
for i in range(1,n+1) :
if din[i] == 0 :
dp[i] = lst[i]
for i in range(1,n+1) :
for j in range(i+1,n+1) :
if Map[i][j] :
tmp = lst[j] + dp[i]
if tmp > dp[j] : # 如果新的值比原来的大
dp[j] = tmp # 更新dp值
before[j] = i # 更新前驱节点
if dp[j] > mx :
last_node = j # 只有在当前点的dp大于已有mx的时候 更新最后一个节点
mx = max(mx,dp[j])
Print(last_node,before)
print()
print(mx)