00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 #ifndef __GRAPH_H
00141 #define __GRAPH_H
00142
00143 #include <hash_set.h>
00144 #include <vector>
00145 #include <stack>
00146 #include <bvector.h>
00147 #include <set>
00148
00149 template <class NODE, class EDGE> struct digraph_node;
00150 template <class NODE, class EDGE> struct digraph_edge;
00151 template <class NODE, class EDGE> struct digraph;
00152 template <class DIGRAPH> struct succ_node_iter;
00153 template <class DIGRAPH> struct succ_edge_iter;
00154 template <class DIGRAPH> struct pred_node_iter;
00155 template <class DIGRAPH> struct pred_edge_iter;
00156
00157
00158 template <class NODE, class EDGE>
00159 struct digraph_edge {
00160 typedef digraph_node<NODE, EDGE> digraph_node;
00161
00162 EDGE edge;
00163 digraph_node *head;
00164 digraph_node *tail;
00165 digraph_edge *next_succ;
00166 digraph_edge *next_pred;
00167
00168 digraph_edge<NODE, EDGE>(digraph_node *v, digraph_node *w) :
00169 tail(v),head(w),next_succ(0),next_pred(0),edge() {}
00170 };
00171
00172
00173 template <class NODE, class EDGE>
00174 struct digraph_node {
00175 typedef digraph_edge<NODE, EDGE> digraph_edge;
00176 typedef digraph<NODE, EDGE> digraph;
00177 typedef succ_node_iter<digraph> succ_node_iter;
00178 typedef pred_node_iter<digraph> pred_node_iter;
00179
00180 NODE node;
00181 int n_succ;
00182 int n_pred;
00183 digraph_edge *first_succ;
00184 digraph_edge *first_pred;
00185
00186 void add_succ(digraph_edge *e) { ++n_succ; e->next_succ = first_succ; first_succ = e; }
00187 void add_pred(digraph_edge *e) { ++n_pred; e->next_pred = first_pred; first_pred = e; }
00188
00189 void delete_succ_edge(digraph_edge *e) {
00190 if (first_succ == e) {
00191 e = e->next_succ;
00192 return;
00193 }
00194 for (digraph_edge *t = e; t->next_succ != e; t = t->next_succ);
00195 if (t->next_succ == e)
00196 t->next_succ = e->next_succ;
00197 }
00198
00199 void delete_pred_edge(digraph_edge *e) {
00200 if (first_pred == e) {
00201 e = e->next_pred;
00202 return;
00203 }
00204 for (digraph_edge *t = e; t->next_pred != e; t = t->next_pred);
00205 if (t->next_pred == e)
00206 t->next_pred = e->next_pred;
00207 }
00208
00209 succ_node_iter succ_node_begin() const
00210 { succ_node_iter s; s.cur = first_succ; return s; }
00211
00212 succ_node_iter succ_node_end() const
00213 { succ_node_iter s; s.cur = 0; return s; }
00214
00215 pred_node_iter pred_node_begin() const
00216 { pred_node_iter s; s.cur = first_pred; return s; }
00217
00218 pred_node_iter pred_node_end() const
00219 { pred_node_iter s; s.cur = 0; return s; }
00220
00221 digraph_node<NODE, EDGE>(NODE v) {
00222 node = v; n_succ = n_pred = 0; first_succ = first_pred = 0; }
00223
00224 digraph_node<NODE, EDGE>() {
00225 n_succ = n_pred = 0; first_succ = first_pred = 0; }
00226 };
00227
00228
00229 template <class X>
00230 struct ptr_hash
00231 {
00232 size_t operator()(const X* s) const { return reinterpret_cast<size_t>(s); }
00233 };
00234
00235 template <class NODE, class EDGE>
00236 struct digraph {
00237 typedef digraph<NODE, EDGE> self;
00238 typedef digraph_node<NODE, EDGE> node;
00239 typedef digraph_edge<NODE, EDGE> edge;
00240 typedef succ_edge_iter<self> succ_edge_iter;
00241 typedef succ_node_iter<self> succ_node_iter;
00242 typedef pred_edge_iter<self> pred_edge_iter;
00243 typedef pred_node_iter<self> pred_node_iter;
00244 typedef hash_set<node*, ptr_hash<node> > node_set_type;
00245 typedef node_set_type::iterator node_set_iter;
00246
00247 node_set_type node_set;
00248
00249 node_set_iter node_set_begin() { return node_set.begin(); }
00250 node_set_iter node_set_end() { return node_set.end(); }
00251
00252 node *add_node(NODE v) {
00253 node *p = new node(v);
00254 node_set.insert(p);
00255 return p;
00256 }
00257
00258 node *add_node() {
00259 node *p = new node();
00260 node_set.insert(p);
00261 return p;
00262 }
00263
00264 edge *add_edge(node *v, node *w) {
00265 edge *e = new edge(v, w);
00266 v->add_succ(e);
00267 w->add_pred(e);
00268 return e;
00269 }
00270
00271 void delete_edge(edge *e) {
00272 e->tail->delete_succ_edge(e);
00273 e->head->delete_pred_edge(e);
00274 delete e;
00275 }
00276
00277 void delete_node(node *v) {
00278 node_set.erase(v);
00279 delete v;
00280 }
00281
00282 void delete_node_and_edge(node *v) {
00283 while (v->first_succ)
00284 v->delete_succ_edge(v->first_succ);
00285 while (v->first_pred)
00286 v->delete_succ_edge(v->first_pred);
00287 delete_node(v);
00288 }
00289
00290 edge *find_edge(node *v, node *w);
00291 node *head(edge *e);
00292 node *tail(edge *e);
00293
00294 succ_node_iter succ_node_begin(node *v) const
00295 { succ_node_iter s; s.cur = v->first_succ; return s; }
00296
00297 succ_node_iter succ_node_end(node *v) const
00298 { succ_node_iter s; s.cur = 0; return s; }
00299
00300 pred_node_iter pred_node_begin(node *v) const
00301 { pred_node_iter s; s.cur = v->first_succ; return s; }
00302
00303 pred_node_iter pred_node_end(node *v) const
00304 { pred_node_iter s; s.cur = 0; return s; }
00305
00306 succ_edge_iter succ_edge_begin(node *v) const
00307 { succ_edge_iter s; s.cur = v->first_succ; return s; }
00308
00309 succ_edge_iter succ_edge_end(node *v) const
00310 { succ_edge_iter s; s.cur = 0; return s; }
00311
00312 pred_edge_iter pred_edge_begin(node *v) const
00313 { pred_edge_iter s; s.cur = v->first_succ; return s; }
00314
00315 pred_edge_iter pred_edge_end(node *v) const
00316 { pred_edge_iter s; s.cur = 0; return s; }
00317 };
00318
00319
00320
00321 template <class DIGRAPH>
00322 struct succ_node_iter {
00323 typedef DIGRAPH::node node;
00324 typedef DIGRAPH::edge edge;
00325 typedef succ_node_iter<DIGRAPH> self;
00326
00327 edge *cur;
00328
00329 self operator ++(int) { self tmp = *this; cur = cur->next_succ; return tmp; }
00330 self &operator ++() { cur = cur->next_succ; return *this; }
00331 node *operator *() { return cur->head; }
00332 friend bool operator ==(const self& x, const self& y) { return x.cur == y.cur; }
00333
00334 self begin(node *v) const { self s; s.cur = v->first_succ; return s; }
00335 self end(node *v) const { self s; s.cur = 0; return s; }
00336 };
00337
00338
00339 template <class DIGRAPH>
00340 struct succ_edge_iter {
00341 typedef DIGRAPH::node node;
00342 typedef DIGRAPH::edge edge;
00343 typedef succ_edge_iter<DIGRAPH> self;
00344
00345 edge *cur;
00346
00347 self operator ++(int) { self tmp = *this; cur = cur->next_succ; return tmp; }
00348 self& operator ++() { cur = cur->next_succ; return *this; }
00349 edge *operator *() { return cur; }
00350 friend bool operator ==(const self& x, const self& y) { return x.cur == y.cur; }
00351
00352 self begin(node *v) const { self s; s.cur = v->first_succ; return s; }
00353 self end(node *v) const { self s; s.cur = 0; return s; }
00354 };
00355
00356
00357 template <class DIGRAPH>
00358 struct pred_node_iter {
00359 typedef DIGRAPH::node node;
00360 typedef DIGRAPH::edge edge;
00361 typedef pred_node_iter<DIGRAPH> self;
00362
00363 edge *cur;
00364
00365 self operator ++(int) { self tmp = *this; cur = cur->next_pred; return tmp; }
00366 self& operator ++() { cur = cur->next_pred; return *this; }
00367 node *operator *() { return cur->tail; }
00368 friend bool operator ==(const self& x, const self& y) { return x.cur == y.cur; }
00369
00370 self begin(node *v) const { self s; s.cur = v->first_pred; return s; }
00371 self end(node *v) const { self s; s.cur = 0; return s; }
00372 };
00373
00374
00375 template <class DIGRAPH>
00376 struct pred_edge_iter {
00377 typedef DIGRAPH::node node;
00378 typedef DIGRAPH::edge edge;
00379 typedef pred_edge_iter<DIGRAPH> self;
00380
00381 edge *cur;
00382
00383 self operator ++(int) { self tmp = *this; cur = cur->next_pred; return tmp; }
00384 self& operator ++() { cur = cur->next_pred; return *this; }
00385 edge *operator *() { return cur; }
00386 friend bool operator ==(const self& x, const self& y) { return x.cur == y.cur; }
00387
00388 self begin(node *v) const { self s; s.cur = v->first_pred; return s; }
00389 self end(node *v) const { self s; s.cur = 0; return s; }
00390 };
00391
00392
00393
00394 template <class GRAPH, class ITERATOR = GRAPH::succ_node_iter, class VISITED = set<GRAPH::node*> >
00395 struct preorder_iter {
00396 typedef preorder_iter<GRAPH, ITERATOR, VISITED> self;
00397 stack<ITERATOR> state;
00398 VISITED visited_set;
00399
00400 ITERATOR cur;
00401
00402 bool visited(GRAPH::node *v) { return visited_set.find(v) != visited_set.end(); }
00403 void set_visited(GRAPH::node *v) { visited_set.insert(v); }
00404
00405 self &operator ++() {
00406 GRAPH::node *n = *cur;
00407 if (cur.begin(n) != cur.end(n)) {
00408 ITERATOR t = cur.begin(n);
00409 while (t != t.end(0) && visited(*t))
00410 ++t;
00411 if (t != t.end(0)) {
00412 set_visited(*t);
00413 ++cur;
00414 state.push(cur);
00415 cur = t;
00416 return *this;
00417 }
00418 }
00419 ++cur;
00420 while (true) {
00421 while (cur != cur.end(0) && visited(*cur))
00422 ++cur;
00423 if (cur != cur.end(0)) break;
00424 while (cur == cur.end(0) && !state.empty()) {
00425 cur = state.top();
00426 state.pop();
00427 }
00428 if (cur == cur.end(0)) break;
00429 }
00430 if (cur != cur.end(0))
00431 set_visited(*cur);
00432 return *this;
00433 }
00434 self operator ++(int) { self tmp = *this; ++cur; return tmp; }
00435 void set_cur(GRAPH::node *v) {
00436 cur.cur = new GRAPH::edge(v,v);
00437 set_visited(*cur);
00438 }
00439 bool empty() { return cur == cur.end(0); }
00440 GRAPH::node *operator *() { return *cur; }
00441
00442 preorder_iter<GRAPH, ITERATOR, VISITED>() {};
00443 preorder_iter<GRAPH, ITERATOR, VISITED>(GRAPH::node *v) { set_cur(v); };
00444 };
00445
00446
00447 template <class GRAPH, class ITERATOR = GRAPH::succ_node_iter, class VISITED = set<GRAPH::node*> >
00448 struct postorder_iter {
00449 typedef postorder_iter<GRAPH, ITERATOR, VISITED> self;
00450 stack<ITERATOR> state;
00451 VISITED visited_set;
00452
00453 ITERATOR cur;
00454
00455 bool visited(GRAPH::node *v) { return visited_set.find(v) != visited_set.end(); }
00456 void set_visited(GRAPH::node *v) { visited_set.insert(v); }
00457
00458 self &operator ++() {
00459 ++cur;
00460 while (cur != cur.end(0) && visited(*cur))
00461 ++cur;
00462 if (cur == cur.end(0)) {
00463 if (!state.empty()) {
00464 cur = state.top();
00465 state.pop();
00466 return *this;
00467 }
00468 } else {
00469 GRAPH::node *n = *cur;
00470 while (cur.begin(n) != cur.end(n)) {
00471 ITERATOR t = cur.begin(n);
00472 while (t != t.end(0) && visited(*t))
00473 ++t;
00474 if (t != t.end(0)) {
00475 set_visited(*t);
00476 set_visited(*cur);
00477 state.push(cur);
00478 cur = t;
00479 } else
00480 break;
00481 n = *cur;
00482 }
00483 }
00484 if (cur != cur.end(0))
00485 set_visited(*cur);
00486 return *this;
00487 }
00488 self operator ++(int) { self tmp = *this; ++cur; return tmp; }
00489 void set_cur(GRAPH::node *v) {
00490 cur.cur = new GRAPH::edge(v,v);
00491 GRAPH::node *n = *cur;
00492 set_visited(v);
00493 while (cur.begin(n) != cur.end(n)) {
00494 ITERATOR t = cur.begin(n);
00495 while (t != t.end(0) && visited(*t))
00496 ++t;
00497 if (t != t.end(0)) {
00498 set_visited(*t);
00499 set_visited(*cur);
00500 state.push(cur);
00501 cur = t;
00502 } else
00503 break;
00504 n = *cur;
00505 }
00506 if (cur != cur.end(0))
00507 set_visited(*cur);
00508 }
00509 bool empty() { return cur == cur.end(0); }
00510 GRAPH::node *operator *() { return *cur; }
00511
00512 postorder_iter<GRAPH, ITERATOR, VISITED>() {};
00513 postorder_iter<GRAPH, ITERATOR, VISITED>(GRAPH::node *v) { set_cur(v); };
00514 };
00515
00516
00517 template <class GRAPH, class ITERATOR = GRAPH::succ_node_iter, class VISITED = set<GRAPH::node*> >
00518 struct depth_first_iter : preorder_iter<GRAPH, ITERATOR, VISITED> {
00519 depth_first_iter<GRAPH, ITERATOR, VISITED>(GRAPH::node *v) { set_cur(v); };
00520 };
00521
00522
00523 template <class GRAPH, class ITERATOR = GRAPH::succ_node_iter, class VISITED = set<GRAPH::node*> >
00524 struct breath_first_iter {
00525 typedef breath_first_iter<GRAPH, ITERATOR, VISITED> self;
00526 deque<ITERATOR> state;
00527 VISITED visited_set;
00528
00529 bool visited(GRAPH::node *v) { return visited_set.find(v) != visited_set.end(); }
00530 void set_visited(GRAPH::node *v) { visited_set.insert(v); }
00531
00532 self &operator ++() {
00533 if (state.empty()) return *this;
00534 ITERATOR cur = state.front();
00535 state.pop_front();
00536 ITERATOR t;
00537 GRAPH::node *n = *cur;
00538 for (t = cur.begin(n); t != cur.end(n); ++t) {
00539 if (!visited(*t)) {
00540 state.push_back(t);
00541 set_visited(*t);
00542 }
00543 }
00544 return *this;
00545 }
00546 self operator ++(int) { self tmp = *this; ++cur; return tmp; }
00547 void set_cur(GRAPH::node *v) {
00548 ITERATOR t;
00549 t.cur = new GRAPH::edge(v,v);
00550 set_visited(*t);
00551 state.push_back(t);
00552 }
00553 bool empty() { return state.empty(); }
00554 GRAPH::node *operator *() { return *(state.front()); }
00555
00556 breath_first_iter<GRAPH, ITERATOR, VISITED>() {};
00557 breath_first_iter<GRAPH, ITERATOR, VISITED>(GRAPH::node *v) { set_cur(v); };
00558 };
00559
00560
00561 template <class GRAPH,
00562 class SUCC_ITERATOR = GRAPH::succ_node_iter,
00563 class PRED_ITERATOR = GRAPH::pred_node_iter,
00564 class VISITED = set<GRAPH::node*> >
00565 struct dep_order_iter {
00566 typedef dep_order_iter<GRAPH, SUCC_ITERATOR, PRED_ITERATOR, VISITED> self;
00567 deque<GRAPH::node *> state;
00568 VISITED visited_set;
00569
00570 bool visited(GRAPH::node *v) { return visited_set.find(v) != visited_set.end(); }
00571 void set_visited(GRAPH::node *v) { visited_set.insert(v); }
00572
00573 private:
00574 bool all_succ_visited(GRAPH::node *n) {
00575 SUCC_ITERATOR t;
00576 for (t = n->succ_node_begin(); t != n->succ_node_end(); ++t) {
00577 if (!visited(*t))
00578 return false;
00579 }
00580 return true;
00581 }
00582
00583 public:
00584
00585 self &operator ++() {
00586 if (state.empty()) return *this;
00587 GRAPH::node *n = state.front();
00588 state.pop_front();
00589 set_visited(n);
00590
00591 PRED_ITERATOR t;
00592 for (t = n->pred_node_begin(); t != n->pred_node_end(); ++t) {
00593 if (!visited(*t) && all_succ_visited(*t)) {
00594 state.push_back(*t);
00595 set_visited(*t);
00596 }
00597 }
00598 return *this;
00599 }
00600 self operator ++(int) { self tmp = *this; ++cur; return tmp; }
00601 bool empty() { return state.empty(); }
00602 GRAPH::node *operator *() { return state.front(); }
00603
00604 void make_ready(GRAPH::node *n) {
00605 state.push_back(n);
00606 set_visited(n);
00607 }
00608
00609 dep_order_iter<GRAPH, SUCC_ITERATOR, PRED_ITERATOR, VISITED>(GRAPH *g) {
00610 GRAPH::node_set_iter iter;
00611 for (iter = g->node_set_begin(); iter != g->node_set_end(); ++iter) {
00612 if (all_succ_visited(*iter)) {
00613 state.push_back(*iter);
00614 set_visited(*iter);
00615 }
00616 }
00617 }
00618 };
00619
00620
00621 template <class TREE>
00622 struct never_visited {
00623 TREE::node *find(TREE::node *n) { return 0; }
00624 TREE::node *end() { return 0; }
00625 void insert(TREE::node *n) { }
00626 };
00627
00628
00629 template <class TREE, class ITERATOR>
00630 struct preorder_tree_iter :
00631 preorder_iter<TREE, ITERATOR, never_visited<TREE> > {};
00632
00633 template <class TREE, class ITERATOR>
00634 struct postorder_tree_iter :
00635 postorder_iter<TREE, ITERATOR, never_visited<TREE> > {};
00636
00637 template <class TREE, class ITERATOR>
00638 struct depth_first_tree_iter :
00639 depth_first_iter<TREE, ITERATOR, never_visited<TREE> > {};
00640
00641 template <class TREE, class ITERATOR>
00642 struct breath_first_tree_iter :
00643 breath_first_iter<TREE, ITERATOR, never_visited<TREE> > {};
00644
00645
00646 #endif
00647
00648
00649
00650