]>
wirehaze git hosting - graph-theory.git/blob - dfs.c
f189f432223df0bbbed81f746538ea34c9cb161a
17 static __inline__
unsigned int
18 v_idx (struct graph
*g
, struct vertex
*v
)
20 return (unsigned int)(v
- g
->v
);
24 dfs_ (struct graph
*g
, struct graph
*dt
, struct v_state
*vs
, unsigned int ri
)
27 struct v_state
*rs
, *ns
;
31 (rs
= &vs
[ri
])->c
= RED
;
35 while (e
&& (n
= e
->to
))
42 if (new_arc (dt
, ri
, ni
))
60 if (!(dt
= new_graph (g
->nv
)))
61 fatal ("new_graph ()");
63 if (!(vs
= calloc (g
->nv
, sizeof *vs
)))
66 for (vi
= 0; vi
< g
->nv
; ++vi
)
68 if (vs
[vi
].c
== WHITE
)
77 create_example (int argc
, char **argv
)
80 unsigned int nv
, u
, v
;
85 fprintf (stderr
, "Usage: %s <num_vertices> [u1 v1 u2 v2 ...]\n", argv
[0]);
89 nv
= (unsigned int) atoi (argv
[1]);
90 if (!(g
= new_graph (nv
)))
91 fatal ("new_graph ()");
93 /* parse edges in pairs */
94 for (i
= 2; i
< argc
- 1; i
+= 2)
96 u
= (unsigned int) atoi (argv
[i
]);
97 v
= (unsigned int) atoi (argv
[i
+ 1]);
98 if (new_edge (g
, u
, v
))
99 fatal ("new_edge ()");
106 main (int argc
, char **argv
)
108 struct graph
*g
, *dt
;
112 g
= create_example (argc
, argv
);
117 printf ("graph g:\n");
118 for (i
= 0; i
< g
->nv
; ++i
)
120 for (e
= g
->v
[i
].adj
; e
; e
= e
->next
)
122 pr_edge (i
, v_idx (g
, e
->to
));
129 printf ("\ndfs tree dt:\n");
130 for (i
= 0; i
< dt
->nv
; ++i
)
132 for (e
= dt
->v
[i
].adj
; e
; e
= e
->next
)
134 pr_arc (i
, v_idx (dt
, e
->to
));