# HG changeset patch
# User Alpar Juttner <alpar@cs.elte.hu>
# Date 1467812647 -7200
# Wed Jul 06 15:44:07 2016 +0200
# Node ID da78005589e9653d8b57b000bcae9f0436471ed0
# Parent f51c01a1b88eead63515a8b22f6f380595245a42
MaxMatching speed improvement for odd graphs (#604)
diff --git a/lemon/matching.h b/lemon/matching.h
|
a
|
b
|
|
| 2 | 2 | * |
| 3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
| 4 | 4 | * |
| 5 | | * Copyright (C) 2003-2013 |
| | 5 | * Copyright (C) 2003-2016 |
| 6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
| 7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
| 8 | 8 | * |
| … |
… |
|
| 102 | 102 | const Graph& _graph; |
| 103 | 103 | MatchingMap* _matching; |
| 104 | 104 | StatusMap* _status; |
| | 105 | int _matching_size; |
| 105 | 106 | |
| 106 | 107 | EarMap* _ear; |
| 107 | 108 | |
| … |
… |
|
| 401 | 402 | } |
| 402 | 403 | } |
| 403 | 404 | _tree_set->eraseClass(tree); |
| 404 | | |
| | 405 | _matching_size++; |
| 405 | 406 | } |
| 406 | 407 | |
| 407 | 408 | public: |
| … |
… |
|
| 437 | 438 | (*_matching)[n] = INVALID; |
| 438 | 439 | (*_status)[n] = UNMATCHED; |
| 439 | 440 | } |
| | 441 | _matching_size=0; |
| 440 | 442 | } |
| 441 | 443 | |
| 442 | 444 | /// \brief Find an initial matching in a greedy way. |
| … |
… |
|
| 444 | 446 | /// This function finds an initial matching in a greedy way. |
| 445 | 447 | void greedyInit() { |
| 446 | 448 | createStructures(); |
| | 449 | _matching_size=0; |
| 447 | 450 | for (NodeIt n(_graph); n != INVALID; ++n) { |
| 448 | 451 | (*_matching)[n] = INVALID; |
| 449 | 452 | (*_status)[n] = UNMATCHED; |
| … |
… |
|
| 457 | 460 | (*_status)[n] = MATCHED; |
| 458 | 461 | (*_matching)[v] = _graph.oppositeArc(a); |
| 459 | 462 | (*_status)[v] = MATCHED; |
| | 463 | _matching_size++; |
| 460 | 464 | break; |
| 461 | 465 | } |
| 462 | 466 | } |
| … |
… |
|
| 474 | 478 | template <typename MatchingMap> |
| 475 | 479 | bool matchingInit(const MatchingMap& matching) { |
| 476 | 480 | createStructures(); |
| | 481 | _matching_size=0; |
| 477 | 482 | |
| 478 | 483 | for (NodeIt n(_graph); n != INVALID; ++n) { |
| 479 | 484 | (*_matching)[n] = INVALID; |
| … |
… |
|
| 491 | 496 | if ((*_matching)[v] != INVALID) return false; |
| 492 | 497 | (*_matching)[v] = _graph.direct(e, false); |
| 493 | 498 | (*_status)[v] = MATCHED; |
| | 499 | |
| | 500 | _matching_size++; |
| 494 | 501 | } |
| 495 | 502 | } |
| 496 | 503 | return true; |
| … |
… |
|
| 503 | 510 | /// \pre \ref init(), \ref greedyInit() or \ref matchingInit() must be |
| 504 | 511 | /// called before using this function. |
| 505 | 512 | void startSparse() { |
| 506 | | for(NodeIt n(_graph); n != INVALID; ++n) { |
| | 513 | for(NodeIt n(_graph); _matching_size*2<_node_num-1 && n!=INVALID; ++n) { |
| 507 | 514 | if ((*_status)[n] == UNMATCHED) { |
| 508 | 515 | (*_blossom_rep)[_blossom_set->insert(n)] = n; |
| 509 | 516 | _tree_set->insert(n); |
| … |
… |
|
| 522 | 529 | /// \pre \ref init(), \ref greedyInit() or \ref matchingInit() must be |
| 523 | 530 | /// called before using this function. |
| 524 | 531 | void startDense() { |
| 525 | | for(NodeIt n(_graph); n != INVALID; ++n) { |
| | 532 | for(NodeIt n(_graph); _matching_size*2<_node_num-1 && n!=INVALID; ++n) { |
| 526 | 533 | if ((*_status)[n] == UNMATCHED) { |
| 527 | 534 | (*_blossom_rep)[_blossom_set->insert(n)] = n; |
| 528 | 535 | _tree_set->insert(n); |