38#include <gtest/gtest.h>
94 n.get_supply_flow() = 100;
111 EXPECT_EQ(net.get_super_source(),
nullptr);
112 EXPECT_EQ(net.get_super_sink(),
nullptr);
117 auto* p = net.insert_node(100);
124 auto* p = net.insert_node(-50);
131 auto* p = net.insert_node(0);
141 net.insert_node(100);
144 net.insert_node(-30);
151 net.insert_node(100);
152 net.insert_node(-50);
153 net.insert_node(-30);
154 net.insert_node(-20);
161 net.insert_node(100);
163 net.insert_node(-30);
170 net.insert_node(100);
171 net.insert_node(-50);
172 net.insert_node(-30);
179 net.insert_node(100);
180 net.insert_node(-50);
181 net.insert_node(-50);
188 net.insert_node(100);
189 net.insert_node(-30);
200 auto* p = net.insert_node(0);
203 net.set_supply_flow(p, 150);
209 auto* p = net.insert_node(0);
212 net.set_supply_flow(p, -80);
218 auto* p = net.insert_node(0);
221 EXPECT_THROW(net.set_supply_flow(p, 100), std::range_error);
226 auto* p = net.insert_node(0);
229 EXPECT_THROW(net.set_supply_flow(p, -50), std::range_error);
272 auto* result = net.compute_aux_net();
276 EXPECT_NE(net.get_super_source(),
nullptr);
277 EXPECT_NE(net.get_super_sink(),
nullptr);
282 net.compute_aux_net();
294 net.compute_aux_net();
300 net.compute_aux_net();
306 EXPECT_EQ(net.get_super_source(),
nullptr);
307 EXPECT_EQ(net.get_super_sink(),
nullptr);
317 EXPECT_THROW((
void)net.is_feasible(), std::domain_error);
337 auto* n2 = net.insert_node(0);
338 net.insert_arc(n1, n2, 100);
348 auto* s = net.insert_node(100);
352 net.compute_aux_net();
358 auto* s = net.insert_node(100);
362 net.compute_aux_net();
368 auto* d = net.insert_node(-80);
372 net.compute_aux_net();
378 auto* d = net.insert_node(-80);
382 net.compute_aux_net();
388 auto* s = net.insert_node(100);
389 auto* d = net.insert_node(-100);
396 net.insert_arc(s, d, 100);
398 net.compute_aux_net();
404 auto* s = net.insert_node(100);
405 auto* d = net.insert_node(-100);
412 net.insert_arc(s, d, 100);
414 net.compute_aux_net();
424 auto*
s1 = net.insert_node(100);
425 auto*
s2 = net.insert_node(50);
432 net.compute_aux_net();
444 auto* d1 = net.insert_node(-100);
445 auto* d2 = net.insert_node(-50);
452 net.compute_aux_net();
464 auto*
s1 = net.insert_node(100);
465 auto*
s2 = net.insert_node(80);
466 auto* d1 = net.insert_node(-60);
467 auto* d2 = net.insert_node(-70);
469 s1->out_cap = 200;
s1->out_flow = 50;
470 s2->out_cap = 200;
s2->out_flow = 80;
471 d1->in_cap = 200; d1->in_flow = 30;
472 d2->in_cap = 200; d2->in_flow = 70;
474 net.compute_aux_net();
489 auto* p = net.insert_node(0);
491 p->supply_flow = 100;
498 auto* p = net.insert_node(0);
500 p->supply_flow = -50;
511 auto*
s1 = net.insert_node(100);
512 auto*
s2 = net.insert_node(50);
517 net.compute_aux_net();
520 EXPECT_NE(net.get_super_source(),
nullptr);
521 EXPECT_EQ(net.get_super_sink(),
nullptr);
526 auto* d1 = net.insert_node(-100);
527 auto* d2 = net.insert_node(-50);
532 net.compute_aux_net();
535 EXPECT_EQ(net.get_super_source(),
nullptr);
536 EXPECT_NE(net.get_super_sink(),
nullptr);
545 net.compute_aux_net();
548 EXPECT_EQ(net.get_super_source(),
nullptr);
549 EXPECT_EQ(net.get_super_sink(),
nullptr);
556 auto* p = net.insert_node(0);
581 auto* s = net.insert_node(
"Source", 100.5);
582 auto* d = net.insert_node(
"Sink", -50.25);
598 auto* s = net->insert_node(100);
599 auto* d = net->insert_node(-100);
604 net->compute_aux_net();
621 auto*
factory1 = net.insert_node(100);
622 auto*
factory2 = net.insert_node(50);
624 auto*
store1 = net.insert_node(-80);
625 auto*
store2 = net.insert_node(-70);
645 net.compute_aux_net();
670 ::testing::InitGoogleTest(&
argc,
argv);
WeightedDigraph::Node Node
Dynamic doubly linked list with O(1) size and bidirectional access.
T & get_first() const
Return the first item of the list.
constexpr bool is_empty() const noexcept
Return true if list is empty.
size_t size() const noexcept
Count the number of elements of the list.
Network graph with supply and demand nodes.
Node * insert_node(const Node_Type &node_info, const Flow_Type &supply=0)
Insert a node with info and supply/demand value.
Node with supply/demand flow value.
Main namespace for Aleph-w library functions.
Itor2 copy(Itor1 sourceBeg, const Itor1 &sourceEnd, Itor2 destBeg)
Copy elements from one range to another.
DynList< T > maps(const C &c, Op op)
Classic map operation.
TEST_F(NetSupDemNodeTest, DefaultConstructor)
Net_Sup_Dem_Graph< SimpleNode, SimpleArc > SimpleNet
Arc of a flow network implemented with adjacency lists.
Arc * insert_arc(Node *src_node, Node *tgt_node, const Flow_Type &cap, const Flow_Type &flow, const typename Arc::Arc_Type &arc_info=Arc_Type())
Insert a capacitated arc with an initial flow.
Dynamic doubly linked list implementation.
Supply-demand network flow algorithms.