-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathheap.cpp
121 lines (102 loc) · 3.09 KB
/
heap.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
* Power Crust software, by Nina Amenta, Sunghee Choi and Ravi Krishna Kolluri.
* Copyright (c) 2000 by the University of Texas
* Permission to use, copy, modify, and distribute this software for any
* purpose without fee under the GNU Public License is hereby granted,
* provided that this entire notice is included in all copies of any software
* which is or includes a copy or modification of this software and in all copies
* of the supporting documentation for such software.
* THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR AT&T MAKE ANY
* REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
* OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <assert.h>
#include <float.h>
#include <math.h>
#include "hull.h"
extern struct polelabel *adjlist;
struct heap_array *heap_A;
int heap_length;
int heap_size = 0;
void init_heap(int num)
{
heap_A = (struct heap_array *)calloc(num, sizeof(struct heap_array));
heap_size = 0;
heap_length = num;
fprintf(DFILE,"heap %d initialized\n", num);
}
void heapify(int hi)
{
int largest;
int temp;
double td;
if ((LEFT(hi) <= heap_size) && (heap_A[LEFT(hi)].pri > heap_A[hi].pri))
largest = LEFT(hi);
else largest = hi;
if ((RIGHT(hi) <= heap_size) && (heap_A[RIGHT(hi)].pri > heap_A[largest].pri))
largest = RIGHT(hi);
if (largest != hi) {
temp = heap_A[hi].pid;
heap_A[hi].pid = heap_A[largest].pid;
adjlist[heap_A[hi].pid].hid = hi;
heap_A[largest].pid = temp;
adjlist[heap_A[largest].pid].hid = largest;
td = heap_A[hi].pri;
heap_A[hi].pri = heap_A[largest].pri;
heap_A[largest].pri = td;
heapify(largest);
}
}
int extract_max()
{
int max;
if (heap_size < 1) return -1;
max = heap_A[1].pid;
heap_A[1].pid = heap_A[heap_size].pid;
heap_A[1].pri = heap_A[heap_size].pri;
adjlist[heap_A[1].pid].hid = 1;
heap_size--;
heapify(1);
return max;
}
int insert_heap(int pi, double pr)
{
int i;
heap_size++;
/*printf("heap_size %d\n",heap_size); */
i = heap_size;
while ((i>1)&&(heap_A[PARENT(i)].pri < pr)) {
heap_A[i].pid = heap_A[PARENT(i)].pid;
heap_A[i].pri = heap_A[PARENT(i)].pri;
adjlist[heap_A[i].pid].hid = i;
i = PARENT(i);
};
heap_A[i].pri = pr;
heap_A[i].pid = pi;
adjlist[pi].hid = i;
return i;
}
void update(int hi, double pr)
/* make the element heap_A[hi].pr = pr ... */
{
int pi,i;
heap_A[hi].pri = pr;
pi = heap_A[hi].pid;
if (pr > heap_A[PARENT(hi)].pri) {
i = hi;
while ((i>1)&&(heap_A[PARENT(i)].pri < pr)) {
heap_A[i].pid = heap_A[PARENT(i)].pid;
heap_A[i].pri = heap_A[PARENT(i)].pri;
adjlist[heap_A[i].pid].hid = i;
i = PARENT(i);
};
heap_A[i].pri = pr;
heap_A[i].pid = pi;
adjlist[pi].hid = i;
}
else heapify(hi);
}