14fee23f9Smrg /* A Fibonacci heap datatype. 2*b1e83836Smrg Copyright (C) 1998-2022 Free Software Foundation, Inc. 34fee23f9Smrg Contributed by Daniel Berlin (dan@cgsoftware.com). 44fee23f9Smrg 54fee23f9Smrg This file is part of GCC. 64fee23f9Smrg 74fee23f9Smrg GCC is free software; you can redistribute it and/or modify it 84fee23f9Smrg under the terms of the GNU General Public License as published by 94fee23f9Smrg the Free Software Foundation; either version 2, or (at your option) 104fee23f9Smrg any later version. 114fee23f9Smrg 124fee23f9Smrg GCC is distributed in the hope that it will be useful, but 134fee23f9Smrg WITHOUT ANY WARRANTY; without even the implied warranty of 144fee23f9Smrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 154fee23f9Smrg General Public License for more details. 164fee23f9Smrg 174fee23f9Smrg You should have received a copy of the GNU General Public License 184fee23f9Smrg along with GCC; see the file COPYING. If not, write to 194fee23f9Smrg the Free Software Foundation, 51 Franklin Street - Fifth Floor, 204fee23f9Smrg Boston, MA 02110-1301, USA. */ 214fee23f9Smrg 224fee23f9Smrg /* Fibonacci heaps are somewhat complex, but, there's an article in 234fee23f9Smrg DDJ that explains them pretty well: 244fee23f9Smrg 254fee23f9Smrg http://www.ddj.com/articles/1997/9701/9701o/9701o.htm?topic=algoritms 264fee23f9Smrg 274fee23f9Smrg Introduction to algorithms by Corman and Rivest also goes over them. 284fee23f9Smrg 294fee23f9Smrg The original paper that introduced them is "Fibonacci heaps and their 304fee23f9Smrg uses in improved network optimization algorithms" by Tarjan and 314fee23f9Smrg Fredman (JACM 34(3), July 1987). 324fee23f9Smrg 334fee23f9Smrg Amortized and real worst case time for operations: 344fee23f9Smrg 354fee23f9Smrg ExtractMin: O(lg n) amortized. O(n) worst case. 364fee23f9Smrg DecreaseKey: O(1) amortized. O(lg n) worst case. 374fee23f9Smrg Insert: O(2) amortized. O(1) actual. 384fee23f9Smrg Union: O(1) amortized. O(1) actual. */ 394fee23f9Smrg 404fee23f9Smrg #ifndef _FIBHEAP_H_ 414fee23f9Smrg #define _FIBHEAP_H_ 424fee23f9Smrg 434fee23f9Smrg #include "ansidecl.h" 444fee23f9Smrg 454fee23f9Smrg #ifdef __cplusplus 464fee23f9Smrg extern "C" { 474fee23f9Smrg #endif 484fee23f9Smrg 494fee23f9Smrg typedef long fibheapkey_t; 504fee23f9Smrg 514fee23f9Smrg typedef struct fibheap 524fee23f9Smrg { 534fee23f9Smrg size_t nodes; 544fee23f9Smrg struct fibnode *min; 554fee23f9Smrg struct fibnode *root; 564fee23f9Smrg } *fibheap_t; 574fee23f9Smrg 584fee23f9Smrg typedef struct fibnode 594fee23f9Smrg { 604fee23f9Smrg struct fibnode *parent; 614fee23f9Smrg struct fibnode *child; 624fee23f9Smrg struct fibnode *left; 634fee23f9Smrg struct fibnode *right; 644fee23f9Smrg fibheapkey_t key; 654fee23f9Smrg void *data; 664fee23f9Smrg #if defined (__GNUC__) && (!defined (SIZEOF_INT) || SIZEOF_INT < 4) 674fee23f9Smrg __extension__ unsigned long int degree : 31; 684fee23f9Smrg __extension__ unsigned long int mark : 1; 694fee23f9Smrg #else 704fee23f9Smrg unsigned int degree : 31; 714fee23f9Smrg unsigned int mark : 1; 724fee23f9Smrg #endif 734fee23f9Smrg } *fibnode_t; 744fee23f9Smrg 754fee23f9Smrg extern fibheap_t fibheap_new (void); 764fee23f9Smrg extern fibnode_t fibheap_insert (fibheap_t, fibheapkey_t, void *); 774fee23f9Smrg extern int fibheap_empty (fibheap_t); 784fee23f9Smrg extern fibheapkey_t fibheap_min_key (fibheap_t); 794fee23f9Smrg extern fibheapkey_t fibheap_replace_key (fibheap_t, fibnode_t, 804fee23f9Smrg fibheapkey_t); 814fee23f9Smrg extern void *fibheap_replace_key_data (fibheap_t, fibnode_t, 824fee23f9Smrg fibheapkey_t, void *); 834fee23f9Smrg extern void *fibheap_extract_min (fibheap_t); 844fee23f9Smrg extern void *fibheap_min (fibheap_t); 854fee23f9Smrg extern void *fibheap_replace_data (fibheap_t, fibnode_t, void *); 864fee23f9Smrg extern void *fibheap_delete_node (fibheap_t, fibnode_t); 874fee23f9Smrg extern void fibheap_delete (fibheap_t); 884fee23f9Smrg extern fibheap_t fibheap_union (fibheap_t, fibheap_t); 894fee23f9Smrg 904fee23f9Smrg #ifdef __cplusplus 914fee23f9Smrg } 924fee23f9Smrg #endif 934fee23f9Smrg 944fee23f9Smrg #endif /* _FIBHEAP_H_ */ 95