Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libvgraph/grfold.c
1808 views
1
#include "grhdr.h"
2
3
/******************************************************************************
4
Collapse a group of nodes into a single node. Each such node will
5
be identified by a representative node given in Grnode_t.fold
6
7
Written by Kiem-Phong Vo (02/01/2006).
8
******************************************************************************/
9
10
/* return the representative to 'nd' */
11
Grnode_t* _grfind(Grnode_t* nd)
12
{
13
Grnode_t *f, *fold;
14
15
/* find the current representative node */
16
for(fold = nd; fold != fold->fold; fold = fold->fold)
17
;
18
19
for(f = nd; f != fold; ) /* path compression */
20
{ f = nd->fold; nd->fold = fold; }
21
22
return fold;
23
}
24
25
/* collapse an induced graph into a single node */
26
Grnode_t* grfold(Grnode_t* list, Grnode_t* fold)
27
{
28
Grnode_t *nd;
29
Gredge_t *ed, *enext, *oedge, *iedge;
30
31
if(!list)
32
return NIL(Grnode_t*);
33
if(!fold)
34
fold = list;
35
36
/* make 'fold' the representative */
37
for(nd = list; nd; nd = nd->link)
38
nd->fold = fold;
39
40
/* move all non-reduced edges to 'fold' */
41
oedge = iedge = NIL(Gredge_t*);
42
for(nd = list; nd; nd = nd->link)
43
{ ed = nd->oedge; nd->oedge = NIL(Gredge_t*);
44
for(; ed; ed = enext)
45
{ enext = ed->onext;
46
if(grfind(ed->head) != fold)
47
{ ed->onext = oedge; oedge = ed; }
48
}
49
50
ed = nd->iedge; nd->iedge = NIL(Gredge_t*);
51
for(; ed; ed = enext)
52
{ enext = ed->inext;
53
if(grfind(ed->tail) != fold)
54
{ ed->inext = iedge; iedge = ed; }
55
}
56
}
57
fold->oedge = oedge;
58
fold->iedge = iedge;
59
60
return fold;
61
}
62
63