【洛谷】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 的最短距离。