当前位置:实例文章 » 其他实例» [文章][洛谷]P1529 [USACO2.4] 回家 Bessie Come Home

[洛谷]P1529 [USACO2.4] 回家 Bessie Come Home

发布人:shili8 发布时间:2024-11-08 09:03 阅读次数:0

**回家 Bessie Come Home**

**题目描述**

Bessie 是一只牛,住在一个叫做 "Farm" 的地方。她的家里有很多牛棚,每个牛棚都有一些牛。现在,Bessie 想要回到她自己的牛棚,但是她不知道自己当前所在的位置。帮助 Bessie 回到她自己的牛棚。

**输入**

* $n$ 是牛棚的数量。
* 每个牛棚有一个唯一的 ID,从1 到 $n$。
* 每个牛棚都有一些牛,牛的数量不超过 $1000$。
* Bessie 的当前位置是未知的。

**输出**

* 找到 Bessie 回到她自己的牛棚所需的最短路径长度。

**思路**

这个问题可以使用 Dijkstra 算法来解决。首先,我们需要建立一个图,图中每个节点代表一个牛棚,每条边代表两个牛棚之间的距离(如果两个牛棚之间没有直接连接,则该距离为无穷大)。然后,我们使用 Dijkstra 算法找到从 Bessie 当前位置到她自己的牛棚所需的最短路径长度。

**代码**

cpp#include <iostream>
#include <vector>
#include <queue>
#include <limits>

using namespace std;

const int N =1000 +5;
const long long INF = numeric_limits<long long>::max();

struct Node {
 int id;
 long long dis;
};

bool operator<(Node a, Node b) {
 return a.dis > b.dis;
}

int main() {
 ios::sync_with_stdio(false);
 cin.tie(nullptr);

 int n;
 cin >> n;

 vector<vector<int>> farm(n +1, vector<int>(n +1));
 for (int i =1; i <= n; ++i) {
 for (int j =1; j <= n; ++j) {
 if (i == j) {
 farm[i][j] =0;
 } else {
 cin >> farm[i][j];
 farm[i][j] = max(farm[i][j], INF);
 }
 }
 }

 int m;
 cin >> m;

 vector<int> pos(m +1), num(m +1);

 for (int i =1; i <= m; ++i) {
 cin >> pos[i];
 cin >> num[i];
 }

 long long ans = INF;

 for (int i =1; i <= n; ++i) {
 vector<Node> dis(n +1);
 priority_queue<Node, vector<Node>, greater<Node>> q;
 for (int j =1; j <= n; ++j) {
 dis[j].id = j;
 dis[j].dis = farm[i][j];
 if (farm[i][j] != INF) {
 q.push(dis[j]);
 }
 }

 while (!q.empty()) {
 Node u = q.top();
 q.pop();

 for (int v =1; v <= n; ++v) {
 if (u.dis + farm[v][u.id] < dis[v].dis) {
 dis[v].id = u.id;
 dis[v].dis = u.dis + farm[v][u.id];
 q.push(dis[v]);
 }
 }
 }

 for (int j =1; j <= m; ++j) {
 if (pos[j] == i && ans > dis[pos[j]].dis + num[j]) {
 ans = dis[pos[j]].dis + num[j];
 }
 }
 }

 cout << ans;

 return0;
}


**注释**

* 这个代码使用了 Dijkstra 算法来找到从 Bessie 当前位置到她自己的牛棚所需的最短路径长度。
* 首先,我们建立一个图,图中每个节点代表一个牛棚,每条边代表两个牛棚之间的距离(如果两个牛棚之间没有直接连接,则该距离为无穷大)。
* 然后,我们使用 Dijkstra 算法找到从 Bessie 当前位置到她自己的牛棚所需的最短路径长度。
* 最终,我们输出这个最短路径长度。

**时间复杂度**

* 建立图的时间复杂度为 O(n^2)。
* 使用 Dijkstra 算法的时间复杂度为 O((n + m) * log(n + m))。
* 总时间复杂度为 O(n^2 + (n + m) * log(n + m))。

**空间复杂度**

* 建立图所需的空间复杂度为 O(n^2)。
* 使用 Dijkstra 算法所需的空间复杂度为 O(n + m)。
* 总空间复杂度为 O(n^2 + n + m)。

相关标签:
其他信息

其他资源

Top