From 1ca9100261b8c27cf62acccc3618c5e8375bf57b Mon Sep 17 00:00:00 2001 From: Kohei Morita Date: Fri, 11 Sep 2020 03:14:03 +0900 Subject: [PATCH] fix issue #1 --- atcoder/maxflow.hpp | 7 +++++-- atcoder/mincostflow.hpp | 7 +++++-- test/unittest/maxflow_test.cpp | 9 +++++++++ test/unittest/mincostflow_test.cpp | 9 +++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/atcoder/maxflow.hpp b/atcoder/maxflow.hpp index 02f2354..2b69899 100644 --- a/atcoder/maxflow.hpp +++ b/atcoder/maxflow.hpp @@ -21,8 +21,11 @@ template struct mf_graph { assert(0 <= cap); int m = int(pos.size()); pos.push_back({from, int(g[from].size())}); - g[from].push_back(_edge{to, int(g[to].size()), cap}); - g[to].push_back(_edge{from, int(g[from].size()) - 1, 0}); + int from_id = int(g[from].size()); + int to_id = int(g[to].size()); + if (from == to) to_id++; + g[from].push_back(_edge{to, to_id, cap}); + g[to].push_back(_edge{from, from_id, 0}); return m; } diff --git a/atcoder/mincostflow.hpp b/atcoder/mincostflow.hpp index da0eefb..321f3e1 100644 --- a/atcoder/mincostflow.hpp +++ b/atcoder/mincostflow.hpp @@ -19,8 +19,11 @@ template struct mcf_graph { assert(0 <= to && to < _n); int m = int(pos.size()); pos.push_back({from, int(g[from].size())}); - g[from].push_back(_edge{to, int(g[to].size()), cap, cost}); - g[to].push_back(_edge{from, int(g[from].size()) - 1, 0, -cost}); + int from_id = int(g[from].size()); + int to_id = int(g[to].size()); + if (from == to) to_id++; + g[from].push_back(_edge{to, to_id, cap, cost}); + g[to].push_back(_edge{from, from_id, 0, -cost}); return m; } diff --git a/test/unittest/maxflow_test.cpp b/test/unittest/maxflow_test.cpp index 250d860..4318dd8 100644 --- a/test/unittest/maxflow_test.cpp +++ b/test/unittest/maxflow_test.cpp @@ -169,3 +169,12 @@ TEST(MaxflowTest, BoundUint) { e = {0, 2, INF, INF}; edge_eq(e, g.get_edge(2)); } + +// https://github.com/atcoder/ac-library/issues/1 +TEST(MaxflowTest, SelfLoop) { + mf_graph g(3); + ASSERT_EQ(0, g.add_edge(0, 0, 100)); + + mf_graph::edge e = {0, 0, 100, 0}; + edge_eq(e, g.get_edge(0)); +} diff --git a/test/unittest/mincostflow_test.cpp b/test/unittest/mincostflow_test.cpp index c8c2688..baec43f 100644 --- a/test/unittest/mincostflow_test.cpp +++ b/test/unittest/mincostflow_test.cpp @@ -70,3 +70,12 @@ TEST(MincostflowTest, OutOfRange) { EXPECT_DEATH(g.slope(-1, 3), ".*"); EXPECT_DEATH(g.slope(3, 3), ".*"); } + +// https://github.com/atcoder/ac-library/issues/1 +TEST(MaxflowTest, SelfLoop) { + mcf_graph g(3); + ASSERT_EQ(0, g.add_edge(0, 0, 100, 123)); + + mcf_graph::edge e = {0, 0, 100, 0, 123}; + edge_eq(e, g.get_edge(0)); +}