Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
c根据数据结构与算法分析自己实现优先队列Memory: 208K Time: 16MS Language: C Result: Accepted Source Code #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 20005 #define MinData 0 struct HeapStruct; typedef struct HeapStruct PriorityQueue; struct HeapStruct { int Capacity; int CurrentSize; int *Array; }; PriorityQueue* Initialize() { PriorityQueue *H; H=(PriorityQueue *)malloc(sizeof(PriorityQueue)); H->Array=(int *)malloc(sizeof(int)*MAX_SIZE); H->Capacity=MAX_SIZE; H->CurrentSize=0; H->Array[0]=MinData; return H; } int IsFull(PriorityQueue *H) { if(H->CurrentSize==H->Capacity) return 1; else return 0; } int IsEmpty(PriorityQueue *H) { if(H->CurrentSize==0) return 1; else return 0; } void Insert(PriorityQueue *H,int element) { int i; if(IsFull(H)) return; for(i=++H->CurrentSize;H->Array[i/2]>element;i/=2) H->Array[i]=H->Array[i/2]; H->Array[i]=element; } int DeletMin(PriorityQueue *H) { int i,Child; int MinElement,LastElement; if(IsEmpty(H)) return H->Array[0]; MinElement=H->Array[1]; LastElement=H->Array[H->CurrentSize--]; for(i=1;i*2<=H->CurrentSize;i=Child) { Child=2*i; if(Child!=H->CurrentSize&&H->Array[Child]>H->Array[Child+1]) Child++; if(LastElement>H->Array[Child]) H->Array[i]=H->Array[Child]; else break; } H->Array[i]=LastElement; return MinElement; } int main() { int i,N; while(scanf("%d",&N)!=EOF) { __int64 min1,min2,e,temp; __int64 minconst=0; PriorityQueue *H=Initialize(); for(i=0;i<N;i++) { scanf("%d",&temp); Insert(H,temp); } while(H->CurrentSize>1) { min1=DeletMin(H); min2=DeletMin(H); e=min1+min2; Insert(H,e); minconst+=e; } printf("%I64d\n",minconst); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator