一共三道题,一道都没写出来。。。(所以只看了第一道题的题目)
第一道题想了10分钟才发现是最短路问题,然后考虑了下,决定用堆优化版的dijkstra。然后实现dijkstra有点想不起来了,写了2,30分钟。然后又发现建图过程出了问题(其实就是把点与点距离转换成边放进去,但一直没有思考清楚哪些点可以到,哪些点能到,哪些不能到),半个小时过去了,相连通的点转换成边初始这个一直每整好,思维还是不清晰。
最后晚上又花了半个多小时整出来了,只试了图上的两个测试样例。
from heapq import *
N,NULL = 1000010,0x3f3f3f3f
h, e, ne, w, idx = [-1] * N, [0] * N, [0] * N, [0] * N, 0
dist, st = [NULL]*N, [False]*N
class Solution:
def add(self,a,b,c):
global idx
e[idx], ne[idx], w[idx], h[a], idx = b, h[a], c, idx, idx+1
print(a,b,c)
def dijkstra_heap(self, n):
heap = []
heappush(heap,(0,1))
dist[1] = 0
while heap:
distance, t = heappop(heap)
if st[t]: continue
else: st[t] = True
i = h[t]
while i!=-1:
b = e[i]
if not st[b]:
if dist[b] > dist[t] + w[i]:
dist[b] = dist[t] + w[i]
heappush(heap,(dist[b],b))
i = ne[i]
return dist[n]
def minDist(self , A) -> int:
row, col = len(A), len(A[0])
for i in range(row):
for j in range(col):
if j<col-1:
value_r = abs(A[i][j+1] - A[i][j])
self.add(i * row + j + 1, i * row + j + 1 + 1, value_r)
if i<row-1:
value_d = abs(A[i+1][j] - A[i][j])
self.add(i * row + j + 1, (i+1) * row + j + 1, value_d)
ans = self.dijkstra_heap(row*col)
return ans
lis1 = list([[3,2,1],[1,3,5],[7,8,9]])
lis2 = list([[5,1,1],[5,4,5],[7,8,6]])
A = Solution()
print(A.minDist(lis2))