Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迪克斯特拉';s算法-邻接矩阵和列表_C++_Algorithm_Dijkstra_Adjacency List_Adjacency Matrix - Fatal编程技术网

C++ 迪克斯特拉';s算法-邻接矩阵和列表

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

我对Dijkstra的实现有一个奇怪的问题。。。我有两个算法,一个用于邻接矩阵,另一个用于邻接列表。它们几乎是相同的,唯一的区别是从这些结构中传递数字

我把矩阵中的数字保存在一个叫做weightmat的简单二维矩阵中。 列表中的数字保存在名为nbhlist的列表数组中。 列表由名为ListNode的结构组成

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;
        }
    };