prim 알고리즘 관련 질문입니다.
글쓴이: canuyes / 작성시간: 목, 2013/02/28 - 3:23오후
최소 스패닝 트리를 배우면서 prim 알고리즘을 접하게 되었습니다.
알고리즘의 작동 과정은 이해를 하였으나 책에 나와 있는 C 소스 코드에 몇가지 질문이 있어 올려봅니다.
참고 중인 책에는 주석이 하나도 달려있지 않아 이해가 어려웠기 때문입니다,
책에서는 인접 리스트를 이용하여 그래프를 표현하고 스패닝 트리를 만드는 내용이 설명되어 있습니다.
소스코드에 fringes, precedences 라는 변수명이 아무 주석도 없이 등장합니다.
꽤나 정형화(?)된 변수명이기에 주석이 없었으리라 생각됩니다.
조금은 어이없는 질문이지만 혹시 여기에 prim 알고리즘에서
fringes, precedences 변수가 어떤 역할을 하는지 아시는 분 있으신가요?
혹시 몰라 소스코드 첨부합니다.
책은 박상현님의 뇌를 자극하는 알고리즘 입니다.
void Prim(Graph* G, Vertex* StartVertex, Graph* MST ) { int i = 0; PQNode StartNode = { 0, StartVertex }; PriorityQueue* PQ = PQ_Create(10); Vertex* CurrentVertex = NULL; Edge* CurrentEdge = NULL; int* Weights = (int*) malloc( sizeof(int) * G->VertexCount ); Vertex** MSTVertices = (Vertex**) malloc( sizeof(Vertex*) * G->VertexCount ); Vertex** Fringes = (Vertex**) malloc( sizeof(Vertex*) * G->VertexCount ); Vertex** Precedences = (Vertex**) malloc( sizeof(Vertex*) * G->VertexCount ); CurrentVertex = G->Vertices; while ( CurrentVertex != NULL ) { Vertex* NewVertex = CreateVertex( CurrentVertex->Data ); AddVertex( MST, NewVertex); Fringes[i] = NULL; Precedences[i] = NULL; MSTVertices[i] = NewVertex; Weights[i] = MAX_WEIGHT; CurrentVertex = CurrentVertex->Next; i++; } PQ_Enqueue ( PQ, StartNode ); Weights[StartVertex->Index] = 0; while( ! PQ_IsEmpty( PQ ) ) { PQNode Popped; PQ_Dequeue(PQ, &Popped); CurrentVertex = (Vertex*)Popped.Data; Fringes[CurrentVertex->Index] = CurrentVertex; CurrentEdge = CurrentVertex->AdjacencyList; while ( CurrentEdge != NULL ) { Vertex* TargetVertex = CurrentEdge->Target; if ( Fringes[TargetVertex->Index] == NULL && CurrentEdge->Weight < Weights[TargetVertex->Index] ) { PQNode NewNode = { CurrentEdge->Weight, TargetVertex }; PQ_Enqueue ( PQ, NewNode ); Precedences[TargetVertex->Index] = CurrentEdge->From; Weights[TargetVertex->Index] = CurrentEdge->Weight; } CurrentEdge = CurrentEdge->Next; } } for ( i=0; i<G->VertexCount; i++ ) { int FromIndex, ToIndex; if ( Precedences[i] == NULL ) continue; FromIndex = Precedences[i]->Index; ToIndex = i; AddEdge( MSTVertices[FromIndex], CreateEdge( MSTVertices[FromIndex], MSTVertices[ToIndex], Weights[i] ) ); AddEdge( MSTVertices[ToIndex], CreateEdge( MSTVertices[ToIndex], MSTVertices[FromIndex], Weights[i] ) ); } free( Fringes ); free( Precedences ); free( MSTVertices ); free( Weights ); PQ_Destroy( PQ ); }
Forums:
^^;;
자세한 로직 및 알고리즘 설명은
Introduction to Algorithms 라는 책이 있습니다.
이 책에 자세한 설명이 있었던것으로 기억됩니다.
MIT에서 교재로 쓰인다는 책 답게(?) 꽤나 어렵습니다만, 로직의 흐름을 보기에는 좋은듯 합니다.
해당 부분에서 쓰이는 슈도코드 및 로직의 설명을 보시면 해당 변수의 역할을 아시지 않을까싶습니다.
댓글 달기