mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
| /* A Fibonacci heap datatype.
 | |
|    Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2009
 | |
|    Free Software Foundation, Inc.
 | |
|    Contributed by Daniel Berlin (dan@cgsoftware.com).
 | |
| 
 | |
| This file is part of GCC.
 | |
|    
 | |
| GCC is free software; you can redistribute it and/or modify it
 | |
| under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GCC is distributed in the hope that it will be useful, but
 | |
| WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GCC; see the file COPYING.  If not, write to
 | |
| the Free Software Foundation, 51 Franklin Street - Fifth Floor,
 | |
| Boston, MA 02110-1301, USA.  */
 | |
| 
 | |
| /* Fibonacci heaps are somewhat complex, but, there's an article in
 | |
|    DDJ that explains them pretty well:
 | |
| 
 | |
|    http://www.ddj.com/articles/1997/9701/9701o/9701o.htm?topic=algoritms
 | |
| 
 | |
|    Introduction to algorithms by Corman and Rivest also goes over them.
 | |
| 
 | |
|    The original paper that introduced them is "Fibonacci heaps and their
 | |
|    uses in improved network optimization algorithms" by Tarjan and
 | |
|    Fredman (JACM 34(3), July 1987).
 | |
| 
 | |
|    Amortized and real worst case time for operations:
 | |
| 
 | |
|    ExtractMin: O(lg n) amortized. O(n) worst case.
 | |
|    DecreaseKey: O(1) amortized.  O(lg n) worst case. 
 | |
|    Insert: O(2) amortized. O(1) actual.  
 | |
|    Union: O(1) amortized. O(1) actual.  */
 | |
| 
 | |
| #ifndef _FIBHEAP_H_
 | |
| #define _FIBHEAP_H_
 | |
| 
 | |
| #include "ansidecl.h"
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| typedef long fibheapkey_t;
 | |
| 
 | |
| typedef struct fibheap
 | |
| {
 | |
|   size_t nodes;
 | |
|   struct fibnode *min;
 | |
|   struct fibnode *root;
 | |
| } *fibheap_t;
 | |
| 
 | |
| typedef struct fibnode
 | |
| {
 | |
|   struct fibnode *parent;
 | |
|   struct fibnode *child;
 | |
|   struct fibnode *left;
 | |
|   struct fibnode *right;
 | |
|   fibheapkey_t key;
 | |
|   void *data;
 | |
| #if defined (__GNUC__) && (!defined (SIZEOF_INT) || SIZEOF_INT < 4)
 | |
|   __extension__ unsigned long int degree : 31;
 | |
|   __extension__ unsigned long int mark : 1;
 | |
| #else
 | |
|   unsigned int degree : 31;
 | |
|   unsigned int mark : 1;
 | |
| #endif
 | |
| } *fibnode_t;
 | |
| 
 | |
| extern fibheap_t fibheap_new (void);
 | |
| extern fibnode_t fibheap_insert (fibheap_t, fibheapkey_t, void *);
 | |
| extern int fibheap_empty (fibheap_t);
 | |
| extern fibheapkey_t fibheap_min_key (fibheap_t);
 | |
| extern fibheapkey_t fibheap_replace_key (fibheap_t, fibnode_t,
 | |
|                                          fibheapkey_t);
 | |
| extern void *fibheap_replace_key_data (fibheap_t, fibnode_t,
 | |
|                                        fibheapkey_t, void *);
 | |
| extern void *fibheap_extract_min (fibheap_t);
 | |
| extern void *fibheap_min (fibheap_t);
 | |
| extern void *fibheap_replace_data (fibheap_t, fibnode_t, void *);
 | |
| extern void *fibheap_delete_node (fibheap_t, fibnode_t);
 | |
| extern void fibheap_delete (fibheap_t);
 | |
| extern fibheap_t fibheap_union (fibheap_t, fibheap_t);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* _FIBHEAP_H_ */
 |