... |
... |
@@ -805,41 +805,60 @@
|
805 |
805 |
if (!_matching) {
|
806 |
806 |
_matching = new MatchingMap(_graph);
|
807 |
807 |
}
|
|
808 |
|
808 |
809 |
if (!_node_potential) {
|
809 |
810 |
_node_potential = new NodePotential(_graph);
|
810 |
811 |
}
|
|
812 |
|
811 |
813 |
if (!_blossom_set) {
|
812 |
814 |
_blossom_index = new IntNodeMap(_graph);
|
813 |
815 |
_blossom_set = new BlossomSet(*_blossom_index);
|
814 |
816 |
_blossom_data = new RangeMap<BlossomData>(_blossom_num);
|
|
817 |
} else if (_blossom_data->size() != _blossom_num) {
|
|
818 |
delete _blossom_data;
|
|
819 |
_blossom_data = new RangeMap<BlossomData>(_blossom_num);
|
815 |
820 |
}
|
816 |
821 |
|
817 |
822 |
if (!_node_index) {
|
818 |
823 |
_node_index = new IntNodeMap(_graph);
|
819 |
824 |
_node_heap_index = new IntArcMap(_graph);
|
820 |
825 |
_node_data = new RangeMap<NodeData>(_node_num,
|
821 |
|
NodeData(*_node_heap_index));
|
|
826 |
NodeData(*_node_heap_index));
|
|
827 |
} else {
|
|
828 |
delete _node_data;
|
|
829 |
_node_data = new RangeMap<NodeData>(_node_num,
|
|
830 |
NodeData(*_node_heap_index));
|
822 |
831 |
}
|
823 |
832 |
|
824 |
833 |
if (!_tree_set) {
|
825 |
834 |
_tree_set_index = new IntIntMap(_blossom_num);
|
826 |
835 |
_tree_set = new TreeSet(*_tree_set_index);
|
|
836 |
} else {
|
|
837 |
_tree_set_index->resize(_blossom_num);
|
827 |
838 |
}
|
|
839 |
|
828 |
840 |
if (!_delta1) {
|
829 |
841 |
_delta1_index = new IntNodeMap(_graph);
|
830 |
842 |
_delta1 = new BinHeap<Value, IntNodeMap>(*_delta1_index);
|
831 |
843 |
}
|
|
844 |
|
832 |
845 |
if (!_delta2) {
|
833 |
846 |
_delta2_index = new IntIntMap(_blossom_num);
|
834 |
847 |
_delta2 = new BinHeap<Value, IntIntMap>(*_delta2_index);
|
|
848 |
} else {
|
|
849 |
_delta2_index->resize(_blossom_num);
|
835 |
850 |
}
|
|
851 |
|
836 |
852 |
if (!_delta3) {
|
837 |
853 |
_delta3_index = new IntEdgeMap(_graph);
|
838 |
854 |
_delta3 = new BinHeap<Value, IntEdgeMap>(*_delta3_index);
|
839 |
855 |
}
|
|
856 |
|
840 |
857 |
if (!_delta4) {
|
841 |
858 |
_delta4_index = new IntIntMap(_blossom_num);
|
842 |
859 |
_delta4 = new BinHeap<Value, IntIntMap>(*_delta4_index);
|
|
860 |
} else {
|
|
861 |
_delta4_index->resize(_blossom_num);
|
843 |
862 |
}
|
844 |
863 |
}
|
845 |
864 |
|
... |
... |
@@ -1685,6 +1704,9 @@
|
1685 |
1704 |
void init() {
|
1686 |
1705 |
createStructures();
|
1687 |
1706 |
|
|
1707 |
_blossom_node_list.clear();
|
|
1708 |
_blossom_potential.clear();
|
|
1709 |
|
1688 |
1710 |
for (ArcIt e(_graph); e != INVALID; ++e) {
|
1689 |
1711 |
(*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
|
1690 |
1712 |
}
|
... |
... |
@@ -1698,6 +1720,13 @@
|
1698 |
1720 |
(*_delta2_index)[i] = _delta2->PRE_HEAP;
|
1699 |
1721 |
(*_delta4_index)[i] = _delta4->PRE_HEAP;
|
1700 |
1722 |
}
|
|
1723 |
|
|
1724 |
_delta1->clear();
|
|
1725 |
_delta2->clear();
|
|
1726 |
_delta3->clear();
|
|
1727 |
_delta4->clear();
|
|
1728 |
_blossom_set->clear();
|
|
1729 |
_tree_set->clear();
|
1701 |
1730 |
|
1702 |
1731 |
int index = 0;
|
1703 |
1732 |
for (NodeIt n(_graph); n != INVALID; ++n) {
|
... |
... |
@@ -1709,6 +1738,8 @@
|
1709 |
1738 |
}
|
1710 |
1739 |
}
|
1711 |
1740 |
(*_node_index)[n] = index;
|
|
1741 |
(*_node_data)[index].heap_index.clear();
|
|
1742 |
(*_node_data)[index].heap.clear();
|
1712 |
1743 |
(*_node_data)[index].pot = max;
|
1713 |
1744 |
_delta1->push(n, max);
|
1714 |
1745 |
int blossom =
|
... |
... |
@@ -2198,13 +2229,18 @@
|
2198 |
2229 |
if (!_matching) {
|
2199 |
2230 |
_matching = new MatchingMap(_graph);
|
2200 |
2231 |
}
|
|
2232 |
|
2201 |
2233 |
if (!_node_potential) {
|
2202 |
2234 |
_node_potential = new NodePotential(_graph);
|
2203 |
2235 |
}
|
|
2236 |
|
2204 |
2237 |
if (!_blossom_set) {
|
2205 |
2238 |
_blossom_index = new IntNodeMap(_graph);
|
2206 |
2239 |
_blossom_set = new BlossomSet(*_blossom_index);
|
2207 |
2240 |
_blossom_data = new RangeMap<BlossomData>(_blossom_num);
|
|
2241 |
} else if (_blossom_data->size() != _blossom_num) {
|
|
2242 |
delete _blossom_data;
|
|
2243 |
_blossom_data = new RangeMap<BlossomData>(_blossom_num);
|
2208 |
2244 |
}
|
2209 |
2245 |
|
2210 |
2246 |
if (!_node_index) {
|
... |
... |
@@ -2212,23 +2248,36 @@
|
2212 |
2248 |
_node_heap_index = new IntArcMap(_graph);
|
2213 |
2249 |
_node_data = new RangeMap<NodeData>(_node_num,
|
2214 |
2250 |
NodeData(*_node_heap_index));
|
|
2251 |
} else if (_node_data->size() != _node_num) {
|
|
2252 |
delete _node_data;
|
|
2253 |
_node_data = new RangeMap<NodeData>(_node_num,
|
|
2254 |
NodeData(*_node_heap_index));
|
2215 |
2255 |
}
|
2216 |
2256 |
|
2217 |
2257 |
if (!_tree_set) {
|
2218 |
2258 |
_tree_set_index = new IntIntMap(_blossom_num);
|
2219 |
2259 |
_tree_set = new TreeSet(*_tree_set_index);
|
|
2260 |
} else {
|
|
2261 |
_tree_set_index->resize(_blossom_num);
|
2220 |
2262 |
}
|
|
2263 |
|
2221 |
2264 |
if (!_delta2) {
|
2222 |
2265 |
_delta2_index = new IntIntMap(_blossom_num);
|
2223 |
2266 |
_delta2 = new BinHeap<Value, IntIntMap>(*_delta2_index);
|
|
2267 |
} else {
|
|
2268 |
_delta2_index->resize(_blossom_num);
|
2224 |
2269 |
}
|
|
2270 |
|
2225 |
2271 |
if (!_delta3) {
|
2226 |
2272 |
_delta3_index = new IntEdgeMap(_graph);
|
2227 |
2273 |
_delta3 = new BinHeap<Value, IntEdgeMap>(*_delta3_index);
|
2228 |
2274 |
}
|
|
2275 |
|
2229 |
2276 |
if (!_delta4) {
|
2230 |
2277 |
_delta4_index = new IntIntMap(_blossom_num);
|
2231 |
2278 |
_delta4 = new BinHeap<Value, IntIntMap>(*_delta4_index);
|
|
2279 |
} else {
|
|
2280 |
_delta4_index->resize(_blossom_num);
|
2232 |
2281 |
}
|
2233 |
2282 |
}
|
2234 |
2283 |
|
... |
... |
@@ -2926,6 +2975,9 @@
|
2926 |
2975 |
void init() {
|
2927 |
2976 |
createStructures();
|
2928 |
2977 |
|
|
2978 |
_blossom_node_list.clear();
|
|
2979 |
_blossom_potential.clear();
|
|
2980 |
|
2929 |
2981 |
for (ArcIt e(_graph); e != INVALID; ++e) {
|
2930 |
2982 |
(*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
|
2931 |
2983 |
}
|
... |
... |
@@ -2937,6 +2989,12 @@
|
2937 |
2989 |
(*_delta4_index)[i] = _delta4->PRE_HEAP;
|
2938 |
2990 |
}
|
2939 |
2991 |
|
|
2992 |
_delta2->clear();
|
|
2993 |
_delta3->clear();
|
|
2994 |
_delta4->clear();
|
|
2995 |
_blossom_set->clear();
|
|
2996 |
_tree_set->clear();
|
|
2997 |
|
2940 |
2998 |
int index = 0;
|
2941 |
2999 |
for (NodeIt n(_graph); n != INVALID; ++n) {
|
2942 |
3000 |
Value max = - std::numeric_limits<Value>::max();
|
... |
... |
@@ -2947,6 +3005,8 @@
|
2947 |
3005 |
}
|
2948 |
3006 |
}
|
2949 |
3007 |
(*_node_index)[n] = index;
|
|
3008 |
(*_node_data)[index].heap_index.clear();
|
|
3009 |
(*_node_data)[index].heap.clear();
|
2950 |
3010 |
(*_node_data)[index].pot = max;
|
2951 |
3011 |
int blossom =
|
2952 |
3012 |
_blossom_set->insert(n, std::numeric_limits<Value>::max());
|