Changeset 2457:8c791ee69a45 in lemon-0.x for lemon/capacity_scaling.h
- Timestamp:
- 06/15/07 16:36:24 (17 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@3294
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/capacity_scaling.h
r2440 r2457 32 32 #define WITH_SCALING 33 33 34 //#define _DEBUG_ITER_ 35 34 36 namespace lemon { 35 37 … … 38 40 39 41 /// \brief Implementation of the capacity scaling version of the 40 /// succes ive shortest path algorithm for finding a minimum cost flow.42 /// successive shortest path algorithm for finding a minimum cost flow. 41 43 /// 42 44 /// \ref lemon::CapacityScaling "CapacityScaling" implements a … … 299 301 /// \brief Map for identifing deficit nodes. 300 302 DeficitBoolMap delta_deficit; 303 304 /// \brief The deficit nodes. 305 std::vector<ResNode> deficit_nodes; 301 306 302 307 #else //WITHOUT_CAPACITY_SCALING … … 511 516 } 512 517 513 /// \brief Runs the successive shortest pathalgorithm.514 /// 515 /// Runs the successive shortest pathalgorithm.518 /// \brief Runs the algorithm. 519 /// 520 /// Runs the algorithm. 516 521 /// 517 522 /// \return \c true if a feasible flow can be found. … … 532 537 #ifdef WITH_SCALING 533 538 // Initilaizing delta value 534 Capacity max_cap = 0; 535 for (EdgeIt e(graph); e != INVALID; ++e) { 536 if (capacity[e] > max_cap) max_cap = capacity[e]; 537 } 538 for (delta = 1; 2 * delta < max_cap; delta *= 2) ; 539 Supply max_sup = 0, max_dem = 0; 540 for (NodeIt n(graph); n != INVALID; ++n) { 541 if (supply[n] > max_sup) max_sup = supply[n]; 542 if (supply[n] < -max_dem) max_dem = -supply[n]; 543 } 544 if (max_dem < max_sup) max_sup = max_dem; 545 for (delta = 1; 2 * delta < max_sup; delta *= 2) ; 539 546 #endif 540 547 return true; … … 547 554 typedef typename DeltaResGraph::EdgeIt DeltaResEdgeIt; 548 555 typedef typename DeltaResGraph::Edge DeltaResEdge; 556 #ifdef _DEBUG_ITER_ 557 int dijk_num = 0; 558 #endif 549 559 550 560 // Processing capacity scaling phases … … 565 575 // Finding excess nodes 566 576 excess_nodes.clear(); 577 deficit_nodes.clear(); 567 578 for (ResNodeIt n(res_graph); n != INVALID; ++n) { 568 if (imbalance[n] >= delta) excess_nodes.push_back(n); 579 if (imbalance[n] >= delta) excess_nodes.push_back(n); 580 if (imbalance[n] <= -delta) deficit_nodes.push_back(n); 569 581 } 570 582 next_node = 0; 571 583 572 // Finding s uccessive shortest paths584 // Finding shortest paths 573 585 while (next_node < excess_nodes.size()) { 586 // Checking deficit nodes 587 if (delta > 1) { 588 bool delta_def = false; 589 for (int i = 0; i < deficit_nodes.size(); ++i) { 590 if (imbalance[deficit_nodes[i]] <= -delta) { 591 delta_def = true; 592 break; 593 } 594 } 595 if (!delta_def) break; 596 } 597 574 598 // Running Dijkstra 575 599 s = excess_nodes[next_node]; … … 577 601 dijkstra.init(); 578 602 dijkstra.addSource(s); 603 #ifdef _DEBUG_ITER_ 604 ++dijk_num; 605 #endif 579 606 if ((t = dijkstra.start(delta_deficit)) == INVALID) { 580 607 if (delta > 1) { … … 609 636 } 610 637 } 638 #ifdef _DEBUG_ITER_ 639 std::cout << "Cost Scaling algorithm finished with running Dijkstra algorithm " 640 << dijk_num << " times." << std::endl; 641 #endif 611 642 612 643 // Handling nonzero lower bounds … … 629 660 next_node = 0; 630 661 631 // Finding s uccessive shortest paths662 // Finding shortest paths 632 663 ResNode s, t; 633 664 while ( imbalance[excess_nodes[next_node]] > 0 ||
Note: See TracChangeset
for help on using the changeset viewer.