我正在使用Graphs,并编写一些众所周知的算法代码。目前我正在研究Dijkstra算法。
所以,我创建了自己的Heap
类,它作为Dijkstra算法实现的最小优先级队列。因为在Dijkstra算法中,你需要从图中的源顶点更新顶点(已经在堆中)的距离,如果它的距离小于它的当前距离,然后相应地调整堆中的值。
为此,我需要保留一个int position[]
数组来跟踪元素当前在Heap
这是我的Vertex Class ::
class Node{
public:
int data;
int weight;
.....
friend int& operator [](int *a, Node i) {
return a[i.data];
}
};
我的minPriorityQueue
类::
template <typename t>
class minPriorityQueue {
int size, currentPosition;
int *position;
t *data;
bool (*compare)(t data1, t data2);
public:
minPriorityQueue(int size, bool (*func1)(t data1, t data2), int *position) {
this->size = size;
currentPosition = 1;
data = new t[size];
compare = func1;
this->position = position;
}
........
void swapPositionValue(int parent, int temp) {
int tempPosition = position[data[parent]];
position[data[parent]] = position[data[temp]];
position[data[temp]] = tempPosition;
}
......
};
因为我的顶点是0,1,2,3, ...
所以,我尝试重载我的[]operator
类的Vertex
,以便它返回当前顶点的data
(这是一个来自0,1,2,3 ...
,因此我可以使用它来访问position
数组的索引。
我收到编译错误:: error: 'int operator[](int*, graph::Vertex)' must be a nonstatic member function
好吧,既然我得到了这个错误,我认为必须在标准中指定我不能使用友元函数重载[]operator
,但为什么我不能这样做?这会导致任何含糊不清的行为吗?我看不出我目前使用的含糊不清的内容。
其次,有没有办法可以交换position
数组中的值?我的minPriorityQueue
类是一个泛型类,我也在我的代码中的其他几个地方使用它。在函数swapPositionValue
中,如果我将交换语句更改为此::
int tempPosition = position[data[parent].data];
position[data[parent].data] = position[data[temp].data];
position[data[temp].data] = tempPosition;
然后牺牲了“通用”优先级队列的整个想法!因为,它不适用于其他类!
有没有办法可以实现这个功能?
EDIT1 ::完整的代码:: http://ideone.com/GRQHHZ (使用Ideone粘贴代码,因为代码仍然非常大,包含2个类)
这就是我想要实现的目标:: http://www.geeksforgeeks.org/greedy-algorithms-set-7-dijkstras-algorithm-for-adjacency-list-representation/ (我只是使用算法)
解释operator[]
的功能是什么::
在我的Dijkstra实现中,所有节点最初都插入到Heap中,其中起始节点具有weight = 0
,而所有其他节点都具有weight = INFINITY
(这意味着我无法到达顶点)所以启动顶点是堆中最重要的元素!现在,当我删除最顶层的元素时,所有已删除的节点中包含路径的Node
都将被修改,其weight
将从INFINITY
修改为某个有限值。所以,我需要更新堆中的节点,然后我需要根据他们的新权重将它们移动到正确的位置!要更新权重,我需要知道Heap
中节点的位置,并且位置由data
的{{1}}决定。因此,重载Node
对我来说只是一个小小的出路,所以当我[]operator
时,我可以访问position[Node]
。
为什么这不重复 ::链接的问题是一个广泛的运算符重载帖子,它只提到1点,它指出position[Node.data]
只能用成员函数重载不然,不说明原因!这是我面临的一个具体问题,我不想牺牲自制Heap的通用属性,也可以将它用于Dijkstra。
EDIT2 ::在写这个解释时,我意识到我在我的重载函数中犯了一个大错误。我改变了它!请检查一下。可能现在更有意义。的道歉!!
重载函数现在看起来像::
[]operator
EDIT3 ::在使用friend int& operator [](int *a, Node i) {
return a[i.data];
}
实现我的Graph
类时,它是一个布尔2D数组,因为我当前的实现是针对未加权的图形,因此最短的路径成为遍历的边数最少! (以防万一重要!)
感谢阅读所有这个大问题,并提供任何帮助! :)