| ... | ... |
@@ -435,96 +435,103 @@ |
| 435 | 435 |
|
| 436 | 436 |
public: |
| 437 | 437 |
Node() {}
|
| 438 | 438 |
Node (Invalid) { _id = -1; }
|
| 439 | 439 |
bool operator==(const Node& node) const {return _id == node._id;}
|
| 440 | 440 |
bool operator!=(const Node& node) const {return _id != node._id;}
|
| 441 | 441 |
bool operator<(const Node& node) const {return _id < node._id;}
|
| 442 | 442 |
}; |
| 443 | 443 |
|
| 444 | 444 |
class Edge {
|
| 445 | 445 |
friend class SmartGraphBase; |
| 446 | 446 |
protected: |
| 447 | 447 |
|
| 448 | 448 |
int _id; |
| 449 | 449 |
explicit Edge(int id) { _id = id;}
|
| 450 | 450 |
|
| 451 | 451 |
public: |
| 452 | 452 |
Edge() {}
|
| 453 | 453 |
Edge (Invalid) { _id = -1; }
|
| 454 | 454 |
bool operator==(const Edge& arc) const {return _id == arc._id;}
|
| 455 | 455 |
bool operator!=(const Edge& arc) const {return _id != arc._id;}
|
| 456 | 456 |
bool operator<(const Edge& arc) const {return _id < arc._id;}
|
| 457 | 457 |
}; |
| 458 | 458 |
|
| 459 | 459 |
class Arc {
|
| 460 | 460 |
friend class SmartGraphBase; |
| 461 | 461 |
protected: |
| 462 | 462 |
|
| 463 | 463 |
int _id; |
| 464 | 464 |
explicit Arc(int id) { _id = id;}
|
| 465 | 465 |
|
| 466 | 466 |
public: |
| 467 | 467 |
operator Edge() const {
|
| 468 | 468 |
return _id != -1 ? edgeFromId(_id / 2) : INVALID; |
| 469 | 469 |
} |
| 470 | 470 |
|
| 471 | 471 |
Arc() {}
|
| 472 | 472 |
Arc (Invalid) { _id = -1; }
|
| 473 | 473 |
bool operator==(const Arc& arc) const {return _id == arc._id;}
|
| 474 | 474 |
bool operator!=(const Arc& arc) const {return _id != arc._id;}
|
| 475 | 475 |
bool operator<(const Arc& arc) const {return _id < arc._id;}
|
| 476 | 476 |
}; |
| 477 | 477 |
|
| 478 | 478 |
|
| 479 | 479 |
|
| 480 | 480 |
SmartGraphBase() |
| 481 | 481 |
: nodes(), arcs() {}
|
| 482 | 482 |
|
| 483 |
typedef True NodeNumTag; |
|
| 484 |
typedef True EdgeNumTag; |
|
| 485 |
typedef True ArcNumTag; |
|
| 486 |
|
|
| 487 |
int nodeNum() const { return nodes.size(); }
|
|
| 488 |
int edgeNum() const { return arcs.size() / 2; }
|
|
| 489 |
int arcNum() const { return arcs.size(); }
|
|
| 483 | 490 |
|
| 484 | 491 |
int maxNodeId() const { return nodes.size()-1; }
|
| 485 | 492 |
int maxEdgeId() const { return arcs.size() / 2 - 1; }
|
| 486 | 493 |
int maxArcId() const { return arcs.size()-1; }
|
| 487 | 494 |
|
| 488 | 495 |
Node source(Arc e) const { return Node(arcs[e._id ^ 1].target); }
|
| 489 | 496 |
Node target(Arc e) const { return Node(arcs[e._id].target); }
|
| 490 | 497 |
|
| 491 | 498 |
Node u(Edge e) const { return Node(arcs[2 * e._id].target); }
|
| 492 | 499 |
Node v(Edge e) const { return Node(arcs[2 * e._id + 1].target); }
|
| 493 | 500 |
|
| 494 | 501 |
static bool direction(Arc e) {
|
| 495 | 502 |
return (e._id & 1) == 1; |
| 496 | 503 |
} |
| 497 | 504 |
|
| 498 | 505 |
static Arc direct(Edge e, bool d) {
|
| 499 | 506 |
return Arc(e._id * 2 + (d ? 1 : 0)); |
| 500 | 507 |
} |
| 501 | 508 |
|
| 502 | 509 |
void first(Node& node) const {
|
| 503 | 510 |
node._id = nodes.size() - 1; |
| 504 | 511 |
} |
| 505 | 512 |
|
| 506 | 513 |
void next(Node& node) const {
|
| 507 | 514 |
--node._id; |
| 508 | 515 |
} |
| 509 | 516 |
|
| 510 | 517 |
void first(Arc& arc) const {
|
| 511 | 518 |
arc._id = arcs.size() - 1; |
| 512 | 519 |
} |
| 513 | 520 |
|
| 514 | 521 |
void next(Arc& arc) const {
|
| 515 | 522 |
--arc._id; |
| 516 | 523 |
} |
| 517 | 524 |
|
| 518 | 525 |
void first(Edge& arc) const {
|
| 519 | 526 |
arc._id = arcs.size() / 2 - 1; |
| 520 | 527 |
} |
| 521 | 528 |
|
| 522 | 529 |
void next(Edge& arc) const {
|
| 523 | 530 |
--arc._id; |
| 524 | 531 |
} |
| 525 | 532 |
|
| 526 | 533 |
void firstOut(Arc &arc, const Node& v) const {
|
| 527 | 534 |
arc._id = nodes[v._id].first_out; |
| 528 | 535 |
} |
| 529 | 536 |
void nextOut(Arc &arc) const {
|
| 530 | 537 |
arc._id = arcs[arc._id].next_out; |
0 comments (0 inline)