blob: 3df7acc1a9ba7aa20645aac4c0389a36465d95b8 [file] [log] [blame]
/**************************************************************/
/* ********************************************************** */
/* * * */
/* * GRAPHS * */
/* * * */
/* * $Module: GRAPH * */
/* * * */
/* * Copyright (C) 1998, 2001 MPI fuer Informatik * */
/* * * */
/* * This program 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 of the License, * */
/* * or (at your option) any later version. * */
/* * * */
/* * This program 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 this program; if not, write * */
/* * to the Free Software Foundation, Inc., 59 Temple * */
/* * Place, Suite 330, Boston, MA 02111-1307 USA * */
/* * * */
/* * * */
/* $Revision$ * */
/* $State$ * */
/* $Date$ * */
/* $Author$ * */
/* * * */
/* * Contact: * */
/* * Christoph Weidenbach * */
/* * MPI fuer Informatik * */
/* * Stuhlsatzenhausweg 85 * */
/* * 66123 Saarbruecken * */
/* * Email: weidenb@mpi-sb.mpg.de * */
/* * Germany * */
/* * * */
/* ********************************************************** */
/**************************************************************/
/* $RCSfile$ */
#ifndef _GRAPH_
#define _GRAPH_
#include "list.h"
typedef struct {
NAT number;
int dfs_num;
int comp_num; /* completion number */
POINTER info; /* user defined information */
LIST neighbors;
} GRAPHNODE_STRUCT, *GRAPHNODE;
typedef struct {
NAT size; /* number of nodes */
LIST nodes; /* list of GRAPHNODES */
NAT dfscount; /* used for DFS */
NAT compcount; /* used for DFS */
} GRAPH_STRUCT, *GRAPH;
static __inline__ NAT graph_NodeNumber(GRAPHNODE Node)
{
return Node->number;
}
static __inline__ int graph_NodeDfsNum(GRAPHNODE Node)
{
return Node->dfs_num;
}
static __inline__ void graph_NodeSetDfsNum(GRAPHNODE Node, int Number)
{
Node->dfs_num = Number;
}
static __inline__ int graph_NodeCompNum(GRAPHNODE Node)
{
return Node->comp_num;
}
static __inline__ void graph_NodeSetCompNum(GRAPHNODE Node, int Number)
{
Node->comp_num = Number;
}
static __inline__ LIST graph_NodeNeighbors(GRAPHNODE Node)
{
return Node->neighbors;
}
static __inline__ POINTER graph_NodeInfo(GRAPHNODE Node)
{
return Node->info;
}
static __inline__ void graph_NodeSetInfo(GRAPHNODE Node, POINTER Info)
{
Node->info = Info;
}
static __inline__ NAT graph_NodeOutdegree(GRAPHNODE Node)
{
return list_Length(graph_NodeNeighbors(Node));
}
static __inline__ BOOL graph_NodeVisited(GRAPHNODE Node)
{
return graph_NodeDfsNum(Node) >= 0;
}
static __inline__ BOOL graph_NodeCompleted(GRAPHNODE Node)
{
return graph_NodeCompNum(Node) >= 0;
}
static __inline__ NAT graph_Size(GRAPH Graph)
{
return Graph->size;
}
static __inline__ LIST graph_Nodes(GRAPH Graph)
{
return Graph->nodes;
}
GRAPH graph_Create(void);
void graph_Delete(GRAPH);
GRAPHNODE graph_GetNode(GRAPH, NAT);
GRAPHNODE graph_AddNode(GRAPH, NAT);
void graph_AddEdge(GRAPHNODE, GRAPHNODE);
void graph_DeleteEdge(GRAPHNODE, GRAPHNODE);
void graph_DeleteDuplicateEdges(GRAPH);
void graph_SortNodes(GRAPH, BOOL (*)(GRAPHNODE, GRAPHNODE));
NAT graph_StronglyConnectedComponents(GRAPH);
void graph_NodePrint(GRAPHNODE Node);
void graph_Print(GRAPH);
#endif