1

ヒープ データ構造を使用してダイクストラのアルゴリズムを実装しています。また、ノードの「推定最小距離」を追跡する配列も使用します。問題は、配列を更新するときです。ヒープ内の対応する値を更新する方法は?

ここにコードがあります

typedef struct temp                       
{
    int nodeTag;    
    int weight; 
    struct temp *next;
}myStruct;  //this structure corresponds to the elements of the linked list 

typedef struct temp *link;

typedef struct
{ 
    int nodeTag;   //each node has an integer nodeTag associated with it
    link l;
}head;    //the head of the elements of the adjacency list

typedef struct {
    head *adjList;
    int numNodes;
    int numEdges;
} Graph;

typedef struct {
    int possibleMinWeight;
    int minFound;    //minFound==1 if true min is found
} dummy;

dummy *dijkstraSSSP(Graph G, int nodeTag)
{
    minHeap H=createEmptyHeap(G.numNodes);  
    while(i=0;i<G.numNodes;i++)
    {
        if(i!=nodeTag)      
            H.A[i].priority=INFINITY;
        else 
            H.A[i].priority=0;
        H.A[i].nodeTag=i;
    }

    convertIntoHeap(H);

    int min;    

    dummy *A=(dummy *)malloc(sizeof(int)*G.numNodes);

    A[nodeTag-1].possibleMinWeight=0;
    A[nodeTag-1].minFound=1; 

    while(!isEmpty(H))
    {
        element e=findMin(H);   H=deleteMin(H);

        A[e.nodeTag-1].minFound=1;      

        link l=G.adjList[e.nodeTag-1].l;        
        while(l!=NULL)
        {
            if(A[l->nodeTag-1].minFound==0);    //its true minimum distance is yet to be found 
            {               
                if(A[l->nodeTag-1].possibleMinWeight>A[x-1].possibleMinWeight+(l->weight))
                    A[l->nodeTag-1].possibleMinWeight=A[x-1]+(l->weight);
            }                   
            l=l->next;
        }
    }   
    return A;
}
4

1 に答える 1

4

DecreaseKey を書き込むには、nodeTags からキュー内の場所へのマップを維持するための優先度キューの実装が必要です。つまり、バイナリ ヒープ データ構造がスワップを要求するたびにこのマップを更新するか、メモリ内のノードを移動しないペアリング ヒープなどのポインター ベースの実装を選択することを意味します。

大規模でやや密度の高いグラフでない限り、DecreaseKey は価値がありません。ノードを複数回挿入し、ExtractMin からの重複した結果を無視するだけです。(重複を検出するには: ダイクストラを実装するたびに、距離またはツリーのいずれかが必要でした。選択したプログラミング言語では、いずれかの配列から少し解放して、各ノードがアクセスされたかどうかを記憶するのは簡単です。 .)

于 2013-05-29T20:59:22.463 に答える