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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
/**************************************************************/
/* ********************************************************** */
/* * * */
/* * 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 FreeBSD * */
/* * Licence. * */
/* * * */
/* * 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 LICENCE file * */
/* * for more details. * */
/* * * */
/* * * */
/* $Revision: 1.2 $ * */
/* $State: Exp $ * */
/* $Date: 2010-02-22 14:09:58 $ * */
/* $Author: weidenb $ * */
/* * * */
/* * Contact: * */
/* * Christoph Weidenbach * */
/* * MPI fuer Informatik * */
/* * Stuhlsatzenhausweg 85 * */
/* * 66123 Saarbruecken * */
/* * Email: spass@mpi-inf.mpg.de * */
/* * Germany * */
/* * * */
/* ********************************************************** */
/**************************************************************/
/* $RCSfile: graph.h,v $ */
#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
|