当前位置:实例文章 » 其他实例» [文章]【洛谷】P1821 [USACO07FEB] Cow Party S(正反建图跑最短路)

【洛谷】P1821 [USACO07FEB] Cow Party S(正反建图跑最短路)

发布人:shili8 发布时间:2024-11-17 22:55 阅读次数:0

**洛谷 P1821 [USACO07FEB] Cow Party S**

**题目描述**

在一片草地上,n头牛都聚集在一起。每头牛都有一个坐标(x, y),并且每头牛都想去参加一个叫做 "Party" 的活动。这个活动的位置是 (0,0)。每头牛都有一定的移动速度,可以在 x 轴和 y 轴上移动。现在,我们需要计算出每头牛到达 Party 的最短距离。

**输入输出**

* 输入:n(牛的数量)、坐标(x, y)以及移动速度(v_x, v_y)
* 输出:每头牛到达 Party 的最短距离**解决方案**

我们可以使用 Dijkstra 算法来求出每头牛到达 Party 的最短距离。首先,我们需要建立一个图,然后使用 Dijkstra 算法找到从每个点到 Party 的最短距离。

### 正向建图

import sysfrom heapq import heappop, heappushdef solve():
 n = int(input())
 cows = []
 for _ in range(n):
 x, y = map(int, input().split())
 v_x, v_y = map(int, input().split())
 cows.append((x, y, v_x, v_y))

 dists = [sys.maxsize] * n pq = [(0,0)] # (dist, idx)

 while pq:
 d, i = heappop(pq)
 if d > dists[i]:
 continue x, y, _, _ = cows[i]
 for j in range(n):
 if j == i:
 continue nx, ny, vx, vy = cows[j]

 new_dist = max(x - nx + (x - nx) // abs(v_x - vx),0) * v_y + 
 max(y - ny + (y - ny) // abs(v_y - vy),0) * v_x if new_dist < dists[j]:
 dists[j] = new_dist heappush(pq, (new_dist, j))

 for i in range(n):
 print(dists[i], end=' ')

solve()


### 反向建图
import sysfrom heapq import heappop, heappushdef solve():
 n = int(input())
 cows = []
 for _ in range(n):
 x, y = map(int, input().split())
 v_x, v_y = map(int, input().split())
 cows.append((x, y, v_x, v_y))

 dists = [sys.maxsize] * n pq = [(0,0)] # (dist, idx)

 while pq:
 d, i = heappop(pq)
 if d > dists[i]:
 continue x, y, _, _ = cows[i]
 for j in range(n):
 if j == i:
 continue nx, ny, vx, vy = cows[j]

 new_dist = max(x - nx + (x - nx) // abs(v_x - vx),0) * v_y + 
 max(y - ny + (y - ny) // abs(v_y - vy),0) * v_x if new_dist < dists[j]:
 dists[j] = new_dist heappush(pq, (new_dist, j))

 for i in range(n):
 print(dists[i], end=' ')

solve()


**注意**

* 这个解决方案使用 Dijkstra 算法来求出每头牛到达 Party 的最短距离。
* 建图的方式是反向建图,即从每个点到 Party 的最短距离。
* 使用 heapq 模块来实现 Dijkstra 算法。

**总结**

这个解决方案使用 Dijkstra 算法来求出每头牛到达 Party 的最短距离。它首先建立一个图,然后使用 Dijkstra 算法找到从每个点到 Party 的最短距离。建图的方式是反向建图,即从每个点到 Party 的最短距离。

相关标签:
其他信息

其他资源

Top