0

私は質問、Dijkstra's Algorithm を C++ で解いています。隣接リストを使用して実装しました。

だから私は のクラス、nodeのクラス、のクラスを持ってminHeapGraphます。

class node
{
    int vertex,weight;
    node *next;
    friend class Graph;
    friend class minHeap;
public:
    node();
    node(int,int);
};
node::node(){
    vertex=weight=0;
    next=0;
}
node::node(int v,int wt){
    vertex=v;
    weight=wt;
    next=0;
}

minHeapクラスをこのように (フレンド関数を使用せずに) 定義しgetDijkSP()、その関数内でのみオブジェクトを使用できるように、通常どおり関数内にオブジェクトを作成しますか?

class minHeap
{
    node *heap;
    int heapSize,capacity,*pos;
public:
    minHeap(int);
    void addElement(node);
    node extractMin();
    void minHeapify(int);
    void decreaseKey(int,int);
};
minHeap::minHeap(int cap){
    heap=new node[capacity=cap];
    heapSize=-1;
    pos=new int[cap]();
}                                        //eliminating other methods

class Graph
{
    node **adjList;
    int v;
    bool *visited;
public:
    Graph(int);
    void addEdge(int,int,int);
    void removeEdge(int,int);
    bool existsEdge(int,int);
    void getDijkSP();
};
Graph::Graph(int vertices){
    adjList=new node*[v=vertices];
    for(int i=0;i<v;i++)
        adjList[i]=NULL;
}
void Graph::getDijkSP(){
    minHeap hp(v);                            //here
    hp.addElement(node(0,0));
    for(int i=1;i<v;i++)
        hp.addElement(node(i,INT_MAX));
    while(!hp.isempty()){
        node temp=hp.extractMin();
        cout<<temp.vertex<<" "<<temp.weight<<endl;
        for(node *current=adjList[temp.vertex];current;current=current->next)
            hp.decreaseKey(current->vertex,current->weight+temp.weight);
    }
}

(または) new キーワードを使用しminHeapてクラスのオブジェクトを作成できるように、フレンド関数を使用してクラスを定義しますか? (これは、クラスのスコープ内でオブジェクトをminHeap定義するのに役立ち、他の機能のすべての関数でも使用できるようになります。)minHeapGraph

class minHeap
{
    node *heap;
    int heapSize,capacity,*pos;
    friend class Graph;                //say like this
public:
    minHeap(int);
    void addElement(node);
    node extractMin();
    void minHeapify(int);
    void decreaseKey(int,int);
};
minHeap::minHeap(int cap){
    heap=new node[capacity=cap]();
    heapSize=-1;
    pos=new int[cap]();
}

class Graph
{
    node **adjList;
    int v;
    bool *visited;
    minHeap *hp;                                //and do this
public:
    Graph(int);
    void addEdge(int,int,int);
    void removeEdge(int,int);
    bool existsEdge(int,int);
    void getDijkSP();
};
Graph::Graph(int vertices){
    adjList=new node*[v=vertices];
    for(int i=0;i<v;i++)
        adjList[i]=NULL;
    hp=new minHeap(v);                        //dynamic allocation
}
void Graph::getDijkSP(){
    hp->addElement(node(0,0));
    for(int i=1;i<v;i++)
        hp->addElement(node(i,INT_MAX));
    while(!hp->isempty()){
        node temp=hp->extractMin();
        cout<<temp.vertex<<" "<<temp.weight<<endl;
        for(node *current=adjList[temp.vertex];current;current=current->next)
            hp->decreaseKey(current->vertex,current->weight+temp.weight);
    }
}

私はこれと他のいくつかの記事を読みましたが、特に、このような同様の種類の質問に対する両方の方法の利点、欠点、および適切性を知りたい.

わかりやすくするために、クラスのコンストラクターを提供しました。

4

1 に答える 1