ノードポインタのベクトルが2つあります。
vector<Node*> tmp;
vector<Node*> nodes;
そして、私が言いますtmp = nodes;
私の場合delete nodes
、それtmp
も削除されます。
constにするなど、変更するtmp
たびに変更しないようにする方法はありますか?nodes
私は基本的にダイクストラ法を実行しています。しかし、このアルゴリズムは最短経路を決定する際に常にノードベクトルを削除しました。つまり、送信元から宛先への最短パスは1回しか実行できません。
グラフがある場合0--->1 ---> 2 ---> 3 ie
CGraph g;
g.Dijkstras(0);
g.PrintShortestRouteTo(2);
g.Dijktras(2);
g.PrintShortestRouteTo(3); <-- source is still 0 since nodes is deleted
therefore I get the path from 0 to 2
class Node
{
public:
Node(int id)
: id(id), previous(NULL),
distanceFromStart(INT_MAX)
{
nodes.push_back(this);
}
public:
int id;
Node* previous;
int distanceFromStart;
};
vector<Node*> nodes;
void CGraph::Dijkstras(int source)
{
nodes[source]->distanceFromStart = 0;
for (int i = 0; i < (int)nodes.size(); i++)
cout << nodes[i]->distanceFromStart << " " ;
cout << "------------------------" << endl;
while (nodes.size() > 0)
{
Node* smallest = ExtractSmallest(nodes);
//cout << "Smallest: " << smallest->id << " ";
//Node* smallest = nnodes[1];
vector<Node*>* adjacentNodes =
AdjacentRemainingNodes(smallest);
const int size = adjacentNodes->size();
for (int i=0; i<size; ++i)
{
Node* adjacent = adjacentNodes->at(i);
int distance = Distance(smallest, adjacent) +
smallest->distanceFromStart;
if (distance < adjacent->distanceFromStart)
{
adjacent->distanceFromStart = distance;
adjacent->previous = smallest;
}
}
delete adjacentNodes;
}
}