Algorithmic Solutions > LEDA > LEDA Guide > Graph Algorithms > Matching Algorithms > Bipartite Weighted Assignment > Example MAX_WEIGHT_ASSIGNMENT()

Example MAX_WEIGHT_ASSIGNMENT()

The following program shows how the function MAX_WEIGHT_ASSIGNMENT() 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 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. We use an edge_array<double> weight to store the weights of the edges of G. The variant of MAX_WEIGHT_BIPARTITE_MATCHING() for int can be used in exactly the same way. You only need to replace double by int in weight and pot.

#include <LEDA/graph/graph.h>
#include <LEDA/graph/_matching.h>

using namespace leda;

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<double> weight(G);
  weight[e0]=1; weight[e1]=2; weight[e2]=3;
  weight[e3]=2; weight[e4]=1; weight[e5]=2;
  weight[e6]=3;

In order to avoid that MAX_WEIGHT_ASSIGNMENT() modifies the edge weights internally, we call MWA_SCALE_WEIGHTS() explicitely. In this small example the weights are, of course, unchanged and MWA_SCALE_WEIGHTS() returns true. We only want to demonstrate the usage here.

The result of MAX_WEIGHT_ASSIGNMENT() 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.

  bool unmodified_weights=MWA_SCALE_WEIGHTS(G,weight);
  if (!unmodified_weights) {
	  std::cout << "Warning: MWBM_SCALE_WEIGHTS()"
	            << " modified your edge weights!" << std::endl;
  }

  node_array<double> pot(G);
  list<edge> M=MAX_WEIGHT_ASSIGNMENT(G,A,B,weight,pot);

  bool result_correct;
  result_correct=CHECK_MAX_WEIGHT_ASSIGNMENT(G,weight,M,pot);

  if (result_correct) {
    std::cout << "Maximum Weighted Assignment:" << std::endl;
    double 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() 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.

See also:

Bipartite Weighted Assignment

Graphs

Parameterized Graphs

Linear Lists

Edge Arrays

Node Arrays


Matching Algorithms


Manual Entries:

Manual Page Bipartite Weighted Matchings and Assignments



Please send any suggestions, comments or questions to leda@algorithmic-solutions.com
© Copyright 2001-2003, Algorithmic Solutions Software GmbH