/* Header file to be used for Dijkstra's Algorithm code. */

/* DjkT_Node: Data structure describing a node in a graph */
/* to be processed by Dijkstra's Algorithm.               */
typedef struct
	{
	int				node_id;
	VosT_Ll_Desc *	connection_list_ptr;
	int				root_distance;
	VosT_Ll_Desc *	path_list_ptr;
	void *			node_state_ptr;
	} DjkT_Node;

/* Specifies a connection to another node at a certain cost. */
/* Note that this connection is not bidirectional.  The      */
/* source of this connection is implicit; an instance of     */
/* this DS should only appear in a connection list of a      */
/* node.                                                     */
typedef struct
	{
	DjkT_Node *		node_ptr;
	int				cost;
	void *			connect_state_ptr;
	} DjkT_Connection;

/* Constants to be used with djk_node_search (). */
#define		DJKC_NODE_SEARCH_LEAST_COST	(1<<0)
#define		DJKC_NODE_SEARCH_REMOVE		(2<<0)

/***** Procedure Declarations *****/
void						djk_path_list_combine (List *list_a_ptr, List *list_b_ptr, List *dest_list_ptr);
int							djk_node_stub_check (DjkT_Node *node_ptr);
DjkT_Node *					djk_node_search (List *node_list_ptr, int options);
DjkT_Node *					djk_node_lookup (List *node_list_ptr, DjkT_Node *node_ptr);
void						djk_node_next_hop_calc (DjkT_Node *current_node_ptr, DjkT_Node *parent_node_ptr);
void						djk_shortest_paths_calc (List *node_list_ptr, DjkT_Node *root_node_ptr, int options);
void						djk_stub_nodes_add (List *node_list_ptr, DjkT_Node *root_node_ptr);
void						djk_path_list_calc (List *node_list_ptr, List *candidate_list_ptr, List *shortest_path_list_ptr, DjkT_Node *current_node_ptr);
DjkT_Connection *			djk_connect_lookup (List *connect_list_ptr, DjkT_Node *node_ptr);
DjkT_Node *					djk_node_create (void);
DjkT_Node *					djk_node_copy (DjkT_Node *node_ptr);
DjkT_Connection *			djk_connection_create (void);
DjkT_Connection *			djk_connection_copy (DjkT_Connection *connect_ptr);
void						djk_node_destroy (DjkT_Node *node_ptr);
void						djk_connection_destroy (DjkT_Connection *connect_ptr);
void						djk_node_list_print (List *node_list_ptr);
void						djk_node_print (DjkT_Node *node_ptr);
void						djk_node_hop_list_print (List *hop_list_ptr);
void						djk_node_path_list_print (List *node_list_ptr);


