0w1

CSAcademy 23 B. Fast Travel ( Greedy )

Round #23 (Div. 2 only)

題意:
有 N 個城市,以座標描述。兩個城市之間的移動的所需時間是曼哈頓距離。有些城市是特別的 ( S = 1 ),特別的城市之間可以花費 T 單位時間進行瞬間移動。Q 筆詢問,每次問兩個城市之間最少需要花費的移動時間。

限制:
2≤N≤1000
1≤T≤2000
0≤Q≤1000
0≤x,y≤1000
There are no two points that share the same coordinates.

解法:
如果沒有要瞬間移動,那麼顯然直接是兩點的曼哈頓距離。
否則,不會瞬間移動超過一次。枚舉兩者最近的特別的城市作為中繼點更新最小值。

時間 / 空間複雜度:
O( Q * N ) / O( N )

N, T = map( int, input().split() )
S = []
X = []
Y = []
for i in range( N ):
  s, x, y = map( int, input().split() )
  S.append( s )
  X.append( x )
  Y.append( y )
Q = int( input() )
for qi in range( Q ):
  A, B = map( int, input().split() )
  A -= 1
  B -= 1
  ans = abs( X[ A ] - X[ B ] ) + abs( Y[ A ] - Y[ B ] )
  if S[ A ] and S[ B ]:
    ans = min( ans, T )
  mina, minb = int( 1e9 ), int( 1e9 )
  for i in range( N ):
    if not S[ i ]: continue
    if i != A and mina > abs( X[ A ] - X[ i ] ) + abs( Y[ A ] - Y[ i ] ):
      mina = abs( X[ A ] - X[ i ] ) + abs( Y[ A ] - Y[ i ] )
    if i != B and minb > abs( X[ B ] - X[ i ] ) + abs( Y[ B ] - Y[ i ] ):
      minb = abs( X[ B ] - X[ i ] ) + abs( Y[ B ] - Y[ i ] )
  if S[ A ] and not S[ B ]:
    ans = min( ans, T + minb )
  if not S[ A ] and S[ B ]:
    ans = min( ans, T + mina )
  if not S[ A ] and not S[ B ]:
    ans = min( ans, T + mina + minb )
  print( ans )