C++ 迪克斯特拉';s算法-邻接矩阵和列表
我对Dijkstra的实现有一个奇怪的问题。。。我有两个算法,一个用于邻接矩阵,另一个用于邻接列表。它们几乎是相同的,唯一的区别是从这些结构中传递数字 我把矩阵中的数字保存在一个叫做weightmat的简单二维矩阵中。 列表中的数字保存在名为nbhlist的列表数组中。 列表由名为ListNode的结构组成C++ 迪克斯特拉';s算法-邻接矩阵和列表,c++,algorithm,dijkstra,adjacency-list,adjacency-matrix,C++,Algorithm,Dijkstra,Adjacency List,Adjacency Matrix,我对Dijkstra的实现有一个奇怪的问题。。。我有两个算法,一个用于邻接矩阵,另一个用于邻接列表。它们几乎是相同的,唯一的区别是从这些结构中传递数字 我把矩阵中的数字保存在一个叫做weightmat的简单二维矩阵中。 列表中的数字保存在名为nbhlist的列表数组中。 列表由名为ListNode的结构组成 struct ListNode{ int number; int weight; List
struct ListNode{
int number;
int weight;
ListNode* next;
ListNode(){
number = weight = 0;
next = 0;
}
};
还有一些常规变量:顶点(顶点数)、边(边数)、vstart(起始顶点数)
现在是Dijkstra矩阵算法的代码:
typedef vector<vector<pair<int, float> > > Graph;
struct Compare{
int operator() (const pair<int,float>& p1, const pair<int,float>& p2)
{
return p1.second > p2.second;
}
};
vector<float> d(vertex);
vector<int> parent(vertex);
for (int i = 0; i < vertex; i++){
d[i] = numeric_limits<float>::max();
parent[i] = -1;
}
priority_queue<pair<int, float>, vector<pair<int, float> >, Compare> MatQueue;
d[vstart] = 0;
MatQueue.push(make_pair(vstart, d[vstart]));
while (!MatQueue.empty()){
int u = MatQueue.top().first;
if (u == vertex - 1) break;
MatQueue.pop();
for (int i = 0; i < vertex; i++){
if (weightmat[u][i] != 0){
int v = i;
float w = weightmat[u][i];
//cout << "U " << u << "Number " << i << " Weight " << weightmat[u][i] << endl;
if (d[v]> d[u] + w){
d[v] = d[u] + w;
parent[v] = u;
MatQueue.push(make_pair(v, d[v]));
}
}
}
}
vector<int> path;
path.clear();
int p = vertex - 1;
path.push_back(vertex - 1);
while (p != vstart)
{
p = parent[p];
path.push_back(p);
}
for (int i = path.size()-1; i >=0; i--){
cout << path[i] << "->";
}
typedef矢量图;
结构比较{
int运算符()(常量对和p1、常量对和p2)
{
返回p1.second>p2.second;
}
};
向量d(顶点);
向量父(顶点);
对于(int i=0;i //cout一个可能的错误是在您的ListNode
结构中:
struct ListNode{
int number;
int weight;
ListNode* next;
ListNode(){
number = weight = 0;
next = 0;
}
};
weight
是一个int
,但是根据代码的其余部分,您的权重是float
s,这可能会导致不必要的截断。我怀疑问题在于您如何构建邻居列表。如果您的算法几乎相同,唯一的区别是图形的表示形式h(矩阵与调整列表)也许它会帮助你使用图形表示的界面,然后只使用一个版本的算法。这样,你可以进行测试,以确保表示在获取/设置顶点和边等方面的行为相同。那么,哪一个给出了正确的答案,如果有的话?大约20:30我会回到家中,我会检查解决方案。@gilleain但这是我的任务-研究不同的表达方式如何起作用(有多快)在这个算法上,这不是一个问题。目前我正在尝试找出哪种结构给了我错误的输出。差异只出现在10个以上的顶点和大约100%的图形密度上,所以很难找到。好吧,现在我非常确定我对矩阵有问题。@EDIT NO!现在我真的不知道该怎么做…有些问题mes矩阵算法给了我正确的路径,有时是列表algorithm@DzikiChrzan你能发布一个输入,两个不同的算法输出和正确的答案吗?
MatQueue.pop();
hand = NbhList[u];
while (hand){
int v = hand->number;
float w = hand->weight;
//cout << "U " << u << "Number " << v << " Weight " << w << endl;
hand = hand->next;
if (d[v] > d[u] + w){
d[v] = d[u] + w;
parent[v] = u;
MatQueue.push(make_pair(v, d[v]));
}
}
MatQueue.pop();
for (int i = 0; i < vertex; i++){
if (weightmat[u][i] != 0){
int v = i;
float w = weightmat[u][i];
//cout << "U " << u << "Number " << i << " Weight " << weightmat[u][i] << endl;
if (d[v]> d[u] + w){
d[v] = d[u] + w;
parent[v] = u;
MatQueue.push(make_pair(v, d[v]));
}
}
}
struct ListNode{
int number;
int weight;
ListNode* next;
ListNode(){
number = weight = 0;
next = 0;
}
};