diff --git a/atcoder/mincostflow.hpp b/atcoder/mincostflow.hpp index 321f3e1..1db2f9e 100644 --- a/atcoder/mincostflow.hpp +++ b/atcoder/mincostflow.hpp @@ -122,7 +122,7 @@ template <class Cap, class Cost> struct mcf_graph { return true; }; Cap flow = 0; - Cost cost = 0, prev_cost = -1; + Cost cost = 0, prev_cost_per_flow = -1; std::vector<std::pair<Cap, Cost>> result; result.push_back({flow, cost}); while (flow < flow_limit) { @@ -139,11 +139,11 @@ template <class Cap, class Cost> struct mcf_graph { Cost d = -dual[s]; flow += c; cost += c * d; - if (prev_cost == d) { + if (prev_cost_per_flow == d) { result.pop_back(); } result.push_back({flow, cost}); - prev_cost = cost; + prev_cost_per_flow = d; } return result; } diff --git a/test/unittest/mincostflow_test.cpp b/test/unittest/mincostflow_test.cpp index baec43f..cd8dcbd 100644 --- a/test/unittest/mincostflow_test.cpp +++ b/test/unittest/mincostflow_test.cpp @@ -79,3 +79,12 @@ TEST(MaxflowTest, SelfLoop) { mcf_graph<int, int>::edge e = {0, 0, 100, 0, 123}; edge_eq(e, g.get_edge(0)); } + +TEST(MincostflowTest, SameCostPaths) { + mcf_graph<int, int> g(3); + ASSERT_EQ(0, g.add_edge(0, 1, 1, 1)); + ASSERT_EQ(1, g.add_edge(1, 2, 1, 0)); + ASSERT_EQ(2, g.add_edge(0, 2, 2, 1)); + auto expected = std::vector<std::pair<int, int>>{{0, 0}, {3, 3}}; + ASSERT_EQ(expected, g.slope(0, 2)); +} \ No newline at end of file