Example MAX_WEIGHT_ASSIGNMENT_T()
The following program shows how the function MAX_WEIGHT_ASSIGNMENT_T()
can be used to compute a maximum weighted assignment and a corresponding
potential function for the nodes in a bipartite graph. It also shows how
the function CHECK_MAX_WEIGHT_ASSIGNMENT() can be used to
check the correctness of the result.
Remark: The graph algorithms in LEDA are generic, that is, they
accept graphs as well as parameterized
graphs.
In order to use the template function MAX_WEIGHT_ASSIGNMENT_T()
we need to include <LEDA/templates/mwb_matching.t> . We
use the LEDA number type integer
as the number type NT for
the edge weights. In constrast to the C++ number type int ,
LEDA's integer does not overflow.
#include <LEDA/graph/graph.h>
#include <LEDA/graph/templates/mwb_matching.h>
#include <LEDA/numbers/integer.h>
using namespace leda;
In main() we first create a bipartite graph G=(A,B,E)
with four nodes in A , four nodes in B, and seven
edges. Notice that there can be no assignment if A and B
have different sizes. We use a list<node>
to store A and B. Then we assign weights to
the edges using an edge_array<integer>
weight .
int main()
{
graph G;
list<node> A;
node a0=G.new_node(); A.append(a0);
node a1=G.new_node(); A.append(a1);
node a2=G.new_node(); A.append(a2);
node a3=G.new_node(); A.append(a3);
list<node> B;
node b0=G.new_node(); B.append(b0);
node b1=G.new_node(); B.append(b1);
node b2=G.new_node(); B.append(b2);
node b3=G.new_node(); B.append(b3);
edge e0=G.new_edge(a0,b1); edge e1=G.new_edge(a0,b3);
edge e2=G.new_edge(a1,b0); edge e3=G.new_edge(a2,b0);
edge e4=G.new_edge(a2,b2); edge e5=G.new_edge(a3,b2);
edge e6=G.new_edge(a3,b3);
edge_array<integer> weight(G);
weight[e0]=1; weight[e1]=2; weight[e2]=3;
weight[e3]=2; weight[e4]=1; weight[e5]=2;
weight[e6]=3;
The result of MAX_WEIGHT_ASSIGNMENT_T() is a list<edge>
M containing the edges in the maximum weighted assignment and
a node_array<integer>
pot for the potentials of the nodes of G .
We use CHECK_MAX_WEIGHT_ASSIGNMENT_T() to check if M
is a maximum weighted assignment of G and pot is
a corresponding potential function. If the result is correct
we output M and pot .
node_array<integer> pot(G);
list<edge> M=MAX_WEIGHT_ASSIGNMENT_T(G,A,B,weight,pot);
bool result_correct;
result_correct=CHECK_MAX_WEIGHT_ASSIGNMENT_T(G,weight,M,pot);
if (result_correct) {
std::cout << "Maximum Weighted Assignment:" << std::endl;
integer weight_of_M=0;
edge e;
forall(e,M) {G.print_edge(e); weight_of_M+=weight[e];}
std::cout << " weight: " << weight_of_M << std::endl;
node v; forall_nodes(v,G) {
std::cout << "pot"; G.print_node(v);
std::cout << "=" << pot[v] << std::endl;
}
}
else std::cout << "Error: M and pot are not"
<< " a correct solution!" << std::endl;
return 0;
}
Remark: There are variants of MAX_WEIGHT_ASSIGNMENT_T()
that do not need the parameter pot and variants without explicitely
stating the bipartition of G as list<node> A,
list<node> B . Have look at the Manual
Page Bipartite Weighted Matchings and Assignments for details.
|