【发布时间】:2020-08-20 18:39:42
【问题描述】:
我正在尝试使用优先级队列使 Dijkstra 最短路径算法适用于具有平行边的加权无向图的大数。我有内存 (64Mb) 和时间 (1 秒) 限制。问题是当图表很大时它给出了错误的答案。我知道这是因为有一个平台(由我的大学制作),其中一个程序正在测试,它在第 13 次测试中显示错误答案占用的内存比以前的测试要多。
typedef unsigned long int vertex_t;
typedef unsigned long int weight_t;
const weight_t max_weight = 1000000000;
struct neighbor
{
vertex_t target;
weight_t weight;
neighbor(vertex_t arg_target, weight_t arg_weight)
: target(arg_target), weight(arg_weight) { }
};
typedef pair<weight_t, vertex_t> weight_vertex_pair_t;
void ShortestPath(vertex_t source, vertex_t target,
const vector<vector<neighbor> > &adjacency,
vector<weight_t> &min_distance, vector<vertex_t> &previous)
{
int n = adjacency.size();
min_distance.clear();
min_distance.resize(n, max_weight);
min_distance[source] = 0;
previous.clear();
previous.resize(n, -1);
priority_queue<weight_vertex_pair_t, vector<weight_vertex_pair_t>,
greater<weight_vertex_pair_t> > vertex_queue;
vertex_queue.push(make_pair(min_distance[source], source));
while (!vertex_queue.empty())
{
weight_t dist = vertex_queue.top().first;
vertex_t u = vertex_queue.top().second;
if (u == target)
{
cout << min_distance[u];
break;
}
vertex_queue.pop();
if (dist > min_distance[u])
continue;
const vector<neighbor> &neighbors = adjacency[u];
for (vector<neighbor>::const_iterator neighbor_iter = neighbors.begin();
neighbor_iter != neighbors.end();
neighbor_iter++)
{
vertex_t v = neighbor_iter->target;
weight_t weight = neighbor_iter->weight;
weight_t u_distance = dist + weight;
if (u_distance < min_distance[v])
{
min_distance[v] = u_distance;
previous[v] = u;
vertex_queue.push(make_pair(min_distance[v], v));
}
}
}
}
我在 main 中也有这个 while 循环来填充图表。顶点数从 1 开始,这就是我减一的原因。
while (y < edges)
{
cin >> a >> b >> c; // vertex, neighbor, weight
adjacency[a-1].push_back(neighbor(b-1, c));
adjacency[b-1].push_back(neighbor(a-1, c));
y += 1;
}
【问题讨论】:
-
这是 32 位还是 64 位代码?你的无符号长的大小是多少?我问是因为你的体重太大了,几乎不适合 32 位的值。确保打开编译器警告。
-
基本上,如果一个 32 位值并进行任何类型的乘法或除法,甚至在该大小上进行大加法,您可能会溢出您的值。
-
图大小和成本的限制是多少?
-
是的,如果你有很多这样的大数字边,你就会超出 32 位整数的范围。
标签: c++ priority-queue shortest-path dijkstra