大家好!请帮我解决问题。来自 Yandex 的任务。第 15 次测试他失败了。这是任务的屏幕截图:
这是我的代码:距离函数返回一个映射,其中存储一对顶点以及它们之间的边的权重。接下来,在主函数中,为广度优先搜索构建了一个图。在图中,如果边权重大于 k,则顶点被视为不可到达。
#include <iostream>
#include <vector>
#include <map>
#include <limits>
#include <queue>
const std::map<std::pair<int, int>, long long> distance(std::vector<std::pair<int, int>>& v)
{
std::map<std::pair<int, int>, long long> my_map;
int size = v.size();
for(int i = 0; i < size; ++i)
{
for(int j = i + 1; j < size; ++j)
{
std::pair<int, int> p;
p.first = i+1;
p.second = j + 1;
my_map[p] = abs(v[i].first - v[j].first) + abs(v[i].second - v[j].second);
}
}
return my_map;
}
int bfs(std::vector<std::vector<int>>& graph, int k, int s, int e){
const unsigned int INF = std::numeric_limits<int>::max();
std::vector<int> dist(graph.size(), INF);
std::queue<int> q;
dist[s] = 0;
q.push(s);
while(!q.empty()){
int v = q.front();
q.pop();
for(int to : graph[v]){
if(dist[to] > dist[v] + 1){
dist[to] = dist[v] + 1;
q.push(to);
}
}
}
return dist[e] == INF ? -1 : dist[e];
}
int main()
{
int amountCity;
std::cin >> amountCity;
std::vector<std::pair<int, int>> coordinats(amountCity);
for(int i=0; i<amountCity; ++i)
{
std::cin>>coordinats[i].first>>coordinats[i].second;
}
int k, start, end;
std::cin >> k >> start >> end;
const std::map<std::pair<int, int>, long long> m = std::move(distance(coordinats));
std::vector<std::vector<int>> v(amountCity);
for(auto& [key, val]: m){
if(val <= k){
v[key.first-1].push_back(key.second-1);
v[key.second-1].push_back(key.first-1);
}
}
std::cout << bfs(v, k, start-1, end-1);
return 0;
}
让我们尝试测试一下。测试由相距40的两个城市组成。如果你设置k = 39,你就无法到达那里。如果你设置k = 40,你可以一趟到达那里。这是正确的:
在下一次测试中我们将把城市之间的距离增加到4·10 9。事实证明你可以到达那里:
my_map[p] = abs(v[i].first - v[j].first) + abs(v[i].second - v[j].second);
因为线路有溢出。调试打印显示城市之间的距离-294967296。my_map[p]
类型是什么long long
并不重要。该运算符+
接受两个类型参数int
,并根据语言规则生成类型为 的结果int
。该金额被破坏,然后写入结果中。