38#include <gtest/gtest.h>
58 auto n0 = g.insert_node(0);
59 auto n1 = g.insert_node(1);
60 auto n2 = g.insert_node(2);
62 g.insert_arc(n0, n1, 1);
63 g.insert_arc(n1, n2, 1);
64 g.insert_arc(n0, n2, 1);
74 auto n0 = g.insert_node(0);
75 auto n1 = g.insert_node(1);
76 auto n2 = g.insert_node(2);
77 auto n3 = g.insert_node(3);
79 g.insert_arc(n0, n1, 1);
80 g.insert_arc(n1, n2, 1);
81 g.insert_arc(n2, n3, 1);
82 g.insert_arc(n3, n0, 1);
93 auto a0 = g.insert_node(0);
94 auto a1 = g.insert_node(1);
95 auto a2 = g.insert_node(2);
97 g.insert_arc(
a0, a1, 1);
98 g.insert_arc(a1, a2, 1);
99 g.insert_arc(
a0, a2, 1);
102 auto b0 = g.insert_node(10);
103 auto b1 = g.insert_node(11);
104 auto b2 = g.insert_node(12);
106 g.insert_arc(
b0, b1, 1);
107 g.insert_arc(b1, b2, 1);
108 g.insert_arc(
b0, b2, 1);
111 g.insert_arc(
a0,
b0, 1);
117Grafo create_complete_graph(
int n)
122 for (
int i = 0; i < n; ++i)
123 nodes.push_back(g.insert_node(i));
125 for (
int i = 0; i < n; ++i)
126 for (
int j = i + 1; j < n; ++j)
139 for (
int i = 0; i < n; ++i)
140 nodes.push_back(g.insert_node(i));
142 for (
int i = 0; i < n - 1; ++i)
155 for (
int i = 0; i < n; ++i)
156 nodes.push_back(g.insert_node(i));
158 for (
int i = 0; i < n; ++i)
159 g.insert_arc(
nodes[i],
nodes[(i + 1) % n], 1);
207 auto n0 = g.insert_node(0);
208 g.insert_arc(n0, n0, 1);
221 auto n0 = g.insert_node(0);
222 auto n1 = g.insert_node(1);
224 g.insert_arc(n0, n1, 1);
225 g.insert_arc(n0, n0, 1);
239 auto n0 = g.insert_node(0);
240 auto n1 = g.insert_node(1);
241 auto n2 = g.insert_node(2);
242 auto n3 = g.insert_node(3);
244 g.insert_arc(n0, n1, 1);
245 g.insert_arc(n2, n3, 1);
281 auto g = create_square();
349 auto g = create_complete_graph(4);
365 auto g = create_complete_graph(5);
400 auto g = create_complete_graph(6);
408 g = create_complete_graph(6);
446 for (Grafo::Node_Iterator it(g); it.has_curr(); it.next_ne())
447 all_nodes.
insert(it.get_curr());
449 for (
auto it = vs.
get_it(); it.has_curr(); it.next())
452 for (
auto it =
vt.
get_it(); it.has_curr(); it.next())
457 for (
auto it = vs.
get_it(); it.has_curr(); it.next())
460 for (
auto it =
vt.
get_it(); it.has_curr(); it.next())
477 for (Grafo::Arc_Iterator it(g); it.has_curr(); it.next_ne())
478 all_arcs.
insert(it.get_curr());
480 for (
auto it = cut.
get_it(); it.has_curr(); it.next())
488 auto n0 = g.insert_node(0);
489 auto n1 = g.insert_node(1);
490 g.insert_arc(n0, n1, 1);
507 auto n0 = g.insert_node(0);
508 auto n1 = g.insert_node(1);
509 auto n2 = g.insert_node(2);
512 g.insert_arc(n0, n1, 1);
513 g.insert_arc(n0, n1, 2);
514 g.insert_arc(n0, n1, 3);
517 g.insert_arc(n1, n2, 4);
532 auto g = create_complete_graph(10);
564 auto n0 = g.insert_node(0);
565 auto n1 = g.insert_node(1);
566 auto n2 = g.insert_node(2);
567 auto n3 = g.insert_node(3);
570 g.insert_arc(n0, n1, 1);
573 g.insert_arc(n2, n3, 2);
577 g.insert_arc(n1, n2, 3);
579 g.insert_arc(n0, n3, 10);
597 for (
auto it = cut.
get_it(); it.has_curr(); it.next())
604 auto n0 = g.insert_node(0);
605 auto n1 = g.insert_node(1);
606 auto n2 = g.insert_node(2);
608 g.insert_arc(n0, n1, 10);
609 g.insert_arc(n1, n2, 10);
626 auto n0 = g.insert_node(0);
627 auto n1 = g.insert_node(1);
628 auto n2 = g.insert_node(2);
630 g.insert_arc(n0, n1, 100);
631 g.insert_arc(n1, n2, 100);
632 g.insert_arc(n0, n2, 100);
650 auto n0 = g.insert_node(0);
651 auto n1 = g.insert_node(1);
652 g.insert_arc(n0, n1, 1);
679 for (
auto it = vs.
get_it(); it.has_curr(); it.next())
681 for (
auto it =
vt.
get_it(); it.has_curr(); it.next())
685 for (
auto it = cut.
get_it(); it.has_curr(); it.next())
687 auto arc = it.get_curr();
688 auto src = g.get_src_node(arc);
689 auto tgt = g.get_tgt_node(arc);
706 auto center = g.insert_node(0);
709 for (
int i = 1; i <= 5; ++i)
711 auto leaf = g.insert_node(i);
713 g.insert_arc(center,
leaf, 1);
736 size_t result =
karger(g, vs,
vt, cut, 0);
810 auto g = create_complete_graph(
static_cast<int>(n));
819 const size_t max_cut = (n / 2) * (n - (n / 2));
839 for (
auto it = vs.
get_it(); it.has_curr(); it.next())
842 for (
auto it =
vt.
get_it(); it.has_curr(); it.next())
858 for (
auto it = vs.
get_it(); it.has_curr(); it.next())
860 for (
auto it =
vt.
get_it(); it.has_curr(); it.next())
864 for (
auto it = cut.
get_it(); it.has_curr(); it.next())
866 auto arc = it.get_curr();
867 auto src = g.get_src_node(arc);
868 auto tgt = g.get_tgt_node(arc);
908 unsigned long seed =
original.get_seed();
943 auto a = g.insert_node(1);
944 auto b = g.insert_node(2);
945 auto c = g.insert_node(3);
946 auto d = g.insert_node(4);
968 auto a = g.insert_node(1);
969 auto b = g.insert_node(2);
970 auto c = g.insert_node(3);
971 auto d = g.insert_node(4);
993 auto g = create_complete_graph(6);
1074 auto g = create_complete_graph(5);
Karger's randomized min-cut algorithm.
WeightedDigraph::Node Node
Graph create_triangle()
Creates a triangle (K_3) - the simplest non-bipartite graph.
Generic directed graph (digraph) wrapper template.
Dynamic singly linked list with functional programming support.
T & insert(const T &item)
Insert a new item by copy.
Dynamic set backed by balanced binary search trees with automatic memory management.
Key * insert(const Key &key)
Inserts a key into the dynamic set.
bool has(const Key &key) const
Arc for graphs implemented with simple adjacency lists.
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.
Karger's randomized minimum cut algorithm.
Graph class implemented with singly-linked adjacency lists.
ArcInfo & get_info() noexcept
Return a modifiable reference to the arc data.
auto get_it() const
Return a properly initialized iterator positioned at the first item on the container.
DynArray< Graph::Node * > nodes
Main namespace for Aleph-w library functions.
Container2< typename Container1::Item_Type > filter(Container1 &container, Operation &operation)
Filter elements that satisfy operation.
Net::Flow_Type min_cut(Net &net, DynSetTree< typename Net::Node * > &vs, DynSetTree< typename Net::Node * > &vt, DynList< typename Net::Arc * > &cuts, DynList< typename Net::Arc * > &cutt)
Compute max flow and the corresponding minimum cut.
DynList< T > maps(const C &c, Op op)
Classic map operation.
Default filter for filtered iterators on arcs.
Arc of graph implemented with double-linked adjacency lists.
bool operator()(typename GT::Arc *a) const
GT create_cycle(size_t n)
Simple graph implementation with adjacency lists.