| ... | ... |
@@ -459,48 +459,55 @@ |
| 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 {
|
0 comments (0 inline)