Update to 1.10.0-RC1
This commit is contained in:
+16
-1
@@ -494,13 +494,17 @@ MCF1stPass::MCF1stPass(LinkGraphJob &job) : MultiCommodityFlow(job)
|
||||
uint size = job.Size();
|
||||
uint accuracy = job.Settings().accuracy;
|
||||
bool more_loops;
|
||||
std::vector<bool> finished_sources(size);
|
||||
|
||||
do {
|
||||
more_loops = false;
|
||||
for (NodeID source = 0; source < size; ++source) {
|
||||
if (finished_sources[source]) continue;
|
||||
|
||||
/* First saturate the shortest paths. */
|
||||
this->Dijkstra<DistanceAnnotation, GraphEdgeIterator>(source, paths);
|
||||
|
||||
bool source_demand_left = false;
|
||||
for (NodeID dest = 0; dest < size; ++dest) {
|
||||
Edge edge = job[source][dest];
|
||||
if (edge.UnsatisfiedDemand() > 0) {
|
||||
@@ -518,8 +522,10 @@ MCF1stPass::MCF1stPass(LinkGraphJob &job) : MultiCommodityFlow(job)
|
||||
path->GetFreeCapacity() > INT_MIN) {
|
||||
this->PushFlow(edge, path, accuracy, UINT_MAX);
|
||||
}
|
||||
if (edge.UnsatisfiedDemand() > 0) source_demand_left = true;
|
||||
}
|
||||
}
|
||||
finished_sources[source] = !source_demand_left;
|
||||
this->CleanupPaths(source, paths);
|
||||
}
|
||||
} while (more_loops || this->EliminateCycles());
|
||||
@@ -537,18 +543,27 @@ MCF2ndPass::MCF2ndPass(LinkGraphJob &job) : MultiCommodityFlow(job)
|
||||
uint size = job.Size();
|
||||
uint accuracy = job.Settings().accuracy;
|
||||
bool demand_left = true;
|
||||
std::vector<bool> finished_sources(size);
|
||||
while (demand_left) {
|
||||
demand_left = false;
|
||||
for (NodeID source = 0; source < size; ++source) {
|
||||
if (finished_sources[source]) continue;
|
||||
|
||||
this->Dijkstra<CapacityAnnotation, FlowEdgeIterator>(source, paths);
|
||||
|
||||
bool source_demand_left = false;
|
||||
for (NodeID dest = 0; dest < size; ++dest) {
|
||||
Edge edge = this->job[source][dest];
|
||||
Path *path = paths[dest];
|
||||
if (edge.UnsatisfiedDemand() > 0 && path->GetFreeCapacity() > INT_MIN) {
|
||||
this->PushFlow(edge, path, accuracy, UINT_MAX);
|
||||
if (edge.UnsatisfiedDemand() > 0) demand_left = true;
|
||||
if (edge.UnsatisfiedDemand() > 0) {
|
||||
demand_left = true;
|
||||
source_demand_left = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
finished_sources[source] = !source_demand_left;
|
||||
this->CleanupPaths(source, paths);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user