gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Add artificial addNode() function to the arc/edge set classes
0 1 0
default
1 file changed with 24 insertions and 0 deletions:
↑ Collapse diff ↑
Ignore white space 96 line context
... ...
@@ -39,96 +39,102 @@
39 39
  protected:
40 40

	
41 41
    struct NodeT {
42 42
      int first_out, first_in;
43 43
      NodeT() : first_out(-1), first_in(-1) {}
44 44
    };
45 45

	
46 46
    typedef typename ItemSetTraits<GR, Node>::
47 47
    template Map<NodeT>::Type NodesImplBase;
48 48

	
49 49
    NodesImplBase* _nodes;
50 50

	
51 51
    struct ArcT {
52 52
      Node source, target;
53 53
      int next_out, next_in;
54 54
      int prev_out, prev_in;
55 55
      ArcT() : prev_out(-1), prev_in(-1) {}
56 56
    };
57 57

	
58 58
    std::vector<ArcT> arcs;
59 59

	
60 60
    int first_arc;
61 61
    int first_free_arc;
62 62

	
63 63
    const GR* _graph;
64 64

	
65 65
    void initalize(const GR& graph, NodesImplBase& nodes) {
66 66
      _graph = &graph;
67 67
      _nodes = &nodes;
68 68
    }
69 69

	
70 70
  public:
71 71

	
72 72
    class Arc {
73 73
      friend class ListArcSetBase<GR>;
74 74
    protected:
75 75
      Arc(int _id) : id(_id) {}
76 76
      int id;
77 77
    public:
78 78
      Arc() {}
79 79
      Arc(Invalid) : id(-1) {}
80 80
      bool operator==(const Arc& arc) const { return id == arc.id; }
81 81
      bool operator!=(const Arc& arc) const { return id != arc.id; }
82 82
      bool operator<(const Arc& arc) const { return id < arc.id; }
83 83
    };
84 84

	
85 85
    ListArcSetBase() : first_arc(-1), first_free_arc(-1) {}
86 86

	
87
    Node addNode() {
88
      LEMON_ASSERT(false,
89
        "This graph structure does not support node insertion");
90
      return INVALID; // avoid warning
91
    }
92

	
87 93
    Arc addArc(const Node& u, const Node& v) {
88 94
      int n;
89 95
      if (first_free_arc == -1) {
90 96
        n = arcs.size();
91 97
        arcs.push_back(ArcT());
92 98
      } else {
93 99
        n = first_free_arc;
94 100
        first_free_arc = arcs[first_free_arc].next_in;
95 101
      }
96 102
      arcs[n].next_in = (*_nodes)[v].first_in;
97 103
      if ((*_nodes)[v].first_in != -1) {
98 104
        arcs[(*_nodes)[v].first_in].prev_in = n;
99 105
      }
100 106
      (*_nodes)[v].first_in = n;
101 107
      arcs[n].next_out = (*_nodes)[u].first_out;
102 108
      if ((*_nodes)[u].first_out != -1) {
103 109
        arcs[(*_nodes)[u].first_out].prev_out = n;
104 110
      }
105 111
      (*_nodes)[u].first_out = n;
106 112
      arcs[n].source = u;
107 113
      arcs[n].target = v;
108 114
      return Arc(n);
109 115
    }
110 116

	
111 117
    void erase(const Arc& arc) {
112 118
      int n = arc.id;
113 119
      if (arcs[n].prev_in != -1) {
114 120
        arcs[arcs[n].prev_in].next_in = arcs[n].next_in;
115 121
      } else {
116 122
        (*_nodes)[arcs[n].target].first_in = arcs[n].next_in;
117 123
      }
118 124
      if (arcs[n].next_in != -1) {
119 125
        arcs[arcs[n].next_in].prev_in = arcs[n].prev_in;
120 126
      }
121 127

	
122 128
      if (arcs[n].prev_out != -1) {
123 129
        arcs[arcs[n].prev_out].next_out = arcs[n].next_out;
124 130
      } else {
125 131
        (*_nodes)[arcs[n].source].first_out = arcs[n].next_out;
126 132
      }
127 133
      if (arcs[n].next_out != -1) {
128 134
        arcs[arcs[n].next_out].prev_out = arcs[n].prev_out;
129 135
      }
130 136

	
131 137
    }
132 138

	
133 139
    void clear() {
134 140
      Node node;
... ...
@@ -371,96 +377,102 @@
371 377
    };
372 378

	
373 379
    std::vector<ArcT> arcs;
374 380

	
375 381
    int first_arc;
376 382
    int first_free_arc;
377 383

	
378 384
    const GR* _graph;
379 385

	
380 386
    void initalize(const GR& graph, NodesImplBase& nodes) {
381 387
      _graph = &graph;
382 388
      _nodes = &nodes;
383 389
    }
384 390

	
385 391
  public:
386 392

	
387 393
    class Edge {
388 394
      friend class ListEdgeSetBase;
389 395
    protected:
390 396

	
391 397
      int id;
392 398
      explicit Edge(int _id) { id = _id;}
393 399

	
394 400
    public:
395 401
      Edge() {}
396 402
      Edge (Invalid) { id = -1; }
397 403
      bool operator==(const Edge& arc) const {return id == arc.id;}
398 404
      bool operator!=(const Edge& arc) const {return id != arc.id;}
399 405
      bool operator<(const Edge& arc) const {return id < arc.id;}
400 406
    };
401 407

	
402 408
    class Arc {
403 409
      friend class ListEdgeSetBase;
404 410
    protected:
405 411
      Arc(int _id) : id(_id) {}
406 412
      int id;
407 413
    public:
408 414
      operator Edge() const { return edgeFromId(id / 2); }
409 415

	
410 416
      Arc() {}
411 417
      Arc(Invalid) : id(-1) {}
412 418
      bool operator==(const Arc& arc) const { return id == arc.id; }
413 419
      bool operator!=(const Arc& arc) const { return id != arc.id; }
414 420
      bool operator<(const Arc& arc) const { return id < arc.id; }
415 421
    };
416 422

	
417 423
    ListEdgeSetBase() : first_arc(-1), first_free_arc(-1) {}
418 424

	
425
    Node addNode() {
426
      LEMON_ASSERT(false,
427
        "This graph structure does not support node insertion");
428
      return INVALID; // avoid warning
429
    }
430

	
419 431
    Edge addEdge(const Node& u, const Node& v) {
420 432
      int n;
421 433

	
422 434
      if (first_free_arc == -1) {
423 435
        n = arcs.size();
424 436
        arcs.push_back(ArcT());
425 437
        arcs.push_back(ArcT());
426 438
      } else {
427 439
        n = first_free_arc;
428 440
        first_free_arc = arcs[n].next_out;
429 441
      }
430 442

	
431 443
      arcs[n].target = u;
432 444
      arcs[n | 1].target = v;
433 445

	
434 446
      arcs[n].next_out = (*_nodes)[v].first_out;
435 447
      if ((*_nodes)[v].first_out != -1) {
436 448
        arcs[(*_nodes)[v].first_out].prev_out = n;
437 449
      }
438 450
      (*_nodes)[v].first_out = n;
439 451
      arcs[n].prev_out = -1;
440 452

	
441 453
      if ((*_nodes)[u].first_out != -1) {
442 454
        arcs[(*_nodes)[u].first_out].prev_out = (n | 1);
443 455
      }
444 456
      arcs[n | 1].next_out = (*_nodes)[u].first_out;
445 457
      (*_nodes)[u].first_out = (n | 1);
446 458
      arcs[n | 1].prev_out = -1;
447 459

	
448 460
      return Edge(n / 2);
449 461
    }
450 462

	
451 463
    void erase(const Edge& arc) {
452 464
      int n = arc.id * 2;
453 465

	
454 466
      if (arcs[n].next_out != -1) {
455 467
        arcs[arcs[n].next_out].prev_out = arcs[n].prev_out;
456 468
      }
457 469

	
458 470
      if (arcs[n].prev_out != -1) {
459 471
        arcs[arcs[n].prev_out].next_out = arcs[n].next_out;
460 472
      } else {
461 473
        (*_nodes)[arcs[n | 1].target].first_out = arcs[n].next_out;
462 474
      }
463 475

	
464 476
      if (arcs[n | 1].next_out != -1) {
465 477
        arcs[arcs[n | 1].next_out].prev_out = arcs[n | 1].prev_out;
466 478
      }
... ...
@@ -771,96 +783,102 @@
771 783

	
772 784
    typedef typename GR::Node Node;
773 785
    typedef typename GR::NodeIt NodeIt;
774 786

	
775 787
  protected:
776 788

	
777 789
    struct NodeT {
778 790
      int first_out, first_in;
779 791
      NodeT() : first_out(-1), first_in(-1) {}
780 792
    };
781 793

	
782 794
    typedef typename ItemSetTraits<GR, Node>::
783 795
    template Map<NodeT>::Type NodesImplBase;
784 796

	
785 797
    NodesImplBase* _nodes;
786 798

	
787 799
    struct ArcT {
788 800
      Node source, target;
789 801
      int next_out, next_in;
790 802
      ArcT() {}
791 803
    };
792 804

	
793 805
    std::vector<ArcT> arcs;
794 806

	
795 807
    const GR* _graph;
796 808

	
797 809
    void initalize(const GR& graph, NodesImplBase& nodes) {
798 810
      _graph = &graph;
799 811
      _nodes = &nodes;
800 812
    }
801 813

	
802 814
  public:
803 815

	
804 816
    class Arc {
805 817
      friend class SmartArcSetBase<GR>;
806 818
    protected:
807 819
      Arc(int _id) : id(_id) {}
808 820
      int id;
809 821
    public:
810 822
      Arc() {}
811 823
      Arc(Invalid) : id(-1) {}
812 824
      bool operator==(const Arc& arc) const { return id == arc.id; }
813 825
      bool operator!=(const Arc& arc) const { return id != arc.id; }
814 826
      bool operator<(const Arc& arc) const { return id < arc.id; }
815 827
    };
816 828

	
817 829
    SmartArcSetBase() {}
818 830

	
831
    Node addNode() {
832
      LEMON_ASSERT(false,
833
        "This graph structure does not support node insertion");
834
      return INVALID; // avoid warning
835
    }
836

	
819 837
    Arc addArc(const Node& u, const Node& v) {
820 838
      int n = arcs.size();
821 839
      arcs.push_back(ArcT());
822 840
      arcs[n].next_in = (*_nodes)[v].first_in;
823 841
      (*_nodes)[v].first_in = n;
824 842
      arcs[n].next_out = (*_nodes)[u].first_out;
825 843
      (*_nodes)[u].first_out = n;
826 844
      arcs[n].source = u;
827 845
      arcs[n].target = v;
828 846
      return Arc(n);
829 847
    }
830 848

	
831 849
    void clear() {
832 850
      Node node;
833 851
      for (first(node); node != INVALID; next(node)) {
834 852
        (*_nodes)[node].first_in = -1;
835 853
        (*_nodes)[node].first_out = -1;
836 854
      }
837 855
      arcs.clear();
838 856
    }
839 857

	
840 858
    void first(Node& node) const {
841 859
      _graph->first(node);
842 860
    }
843 861

	
844 862
    void next(Node& node) const {
845 863
      _graph->next(node);
846 864
    }
847 865

	
848 866
    void first(Arc& arc) const {
849 867
      arc.id = arcs.size() - 1;
850 868
    }
851 869

	
852 870
    void next(Arc& arc) const {
853 871
      --arc.id;
854 872
    }
855 873

	
856 874
    void firstOut(Arc& arc, const Node& node) const {
857 875
      arc.id = (*_nodes)[node].first_out;
858 876
    }
859 877

	
860 878
    void nextOut(Arc& arc) const {
861 879
      arc.id = arcs[arc.id].next_out;
862 880
    }
863 881

	
864 882
    void firstIn(Arc& arc, const Node& node) const {
865 883
      arc.id = (*_nodes)[node].first_in;
866 884
    }
... ...
@@ -1067,96 +1085,102 @@
1067 1085
      Node target;
1068 1086
      int next_out;
1069 1087
      ArcT() {}
1070 1088
    };
1071 1089

	
1072 1090
    std::vector<ArcT> arcs;
1073 1091

	
1074 1092
    const GR* _graph;
1075 1093

	
1076 1094
    void initalize(const GR& graph, NodesImplBase& nodes) {
1077 1095
      _graph = &graph;
1078 1096
      _nodes = &nodes;
1079 1097
    }
1080 1098

	
1081 1099
  public:
1082 1100

	
1083 1101
    class Edge {
1084 1102
      friend class SmartEdgeSetBase;
1085 1103
    protected:
1086 1104

	
1087 1105
      int id;
1088 1106
      explicit Edge(int _id) { id = _id;}
1089 1107

	
1090 1108
    public:
1091 1109
      Edge() {}
1092 1110
      Edge (Invalid) { id = -1; }
1093 1111
      bool operator==(const Edge& arc) const {return id == arc.id;}
1094 1112
      bool operator!=(const Edge& arc) const {return id != arc.id;}
1095 1113
      bool operator<(const Edge& arc) const {return id < arc.id;}
1096 1114
    };
1097 1115

	
1098 1116
    class Arc {
1099 1117
      friend class SmartEdgeSetBase;
1100 1118
    protected:
1101 1119
      Arc(int _id) : id(_id) {}
1102 1120
      int id;
1103 1121
    public:
1104 1122
      operator Edge() const { return edgeFromId(id / 2); }
1105 1123

	
1106 1124
      Arc() {}
1107 1125
      Arc(Invalid) : id(-1) {}
1108 1126
      bool operator==(const Arc& arc) const { return id == arc.id; }
1109 1127
      bool operator!=(const Arc& arc) const { return id != arc.id; }
1110 1128
      bool operator<(const Arc& arc) const { return id < arc.id; }
1111 1129
    };
1112 1130

	
1113 1131
    SmartEdgeSetBase() {}
1114 1132

	
1133
    Node addNode() {
1134
      LEMON_ASSERT(false,
1135
        "This graph structure does not support node insertion");
1136
      return INVALID; // avoid warning
1137
    }
1138

	
1115 1139
    Edge addEdge(const Node& u, const Node& v) {
1116 1140
      int n = arcs.size();
1117 1141
      arcs.push_back(ArcT());
1118 1142
      arcs.push_back(ArcT());
1119 1143

	
1120 1144
      arcs[n].target = u;
1121 1145
      arcs[n | 1].target = v;
1122 1146

	
1123 1147
      arcs[n].next_out = (*_nodes)[v].first_out;
1124 1148
      (*_nodes)[v].first_out = n;
1125 1149

	
1126 1150
      arcs[n | 1].next_out = (*_nodes)[u].first_out;
1127 1151
      (*_nodes)[u].first_out = (n | 1);
1128 1152

	
1129 1153
      return Edge(n / 2);
1130 1154
    }
1131 1155

	
1132 1156
    void clear() {
1133 1157
      Node node;
1134 1158
      for (first(node); node != INVALID; next(node)) {
1135 1159
        (*_nodes)[node].first_out = -1;
1136 1160
      }
1137 1161
      arcs.clear();
1138 1162
    }
1139 1163

	
1140 1164
    void first(Node& node) const {
1141 1165
      _graph->first(node);
1142 1166
    }
1143 1167

	
1144 1168
    void next(Node& node) const {
1145 1169
      _graph->next(node);
1146 1170
    }
1147 1171

	
1148 1172
    void first(Arc& arc) const {
1149 1173
      arc.id = arcs.size() - 1;
1150 1174
    }
1151 1175

	
1152 1176
    void next(Arc& arc) const {
1153 1177
      --arc.id;
1154 1178
    }
1155 1179

	
1156 1180
    void first(Edge& arc) const {
1157 1181
      arc.id = arcs.size() / 2 - 1;
1158 1182
    }
1159 1183

	
1160 1184
    void next(Edge& arc) const {
1161 1185
      --arc.id;
1162 1186
    }
0 comments (0 inline)