Varun Sharma
Varun Sharma

Reputation: 2761

Network Flow Algorithm

I have got a problem like this:

We are given a bipartite graph. For e.g.

A1 B1
A2 B2
A3 B3
A4

And here is the adjacency list representation (assume graph is bidirectional)

B1 -> A2, A3
B2 -> A2, A3, A4
B3 -> A1

Final result should be that all nodes in the left side (As) have exactly 1 incoming edge and at the same time - we need to minimize the maximum number of edges that need to go out of individual Bs nodes. In this case the answer would be:

B3 can connect to A1
B2 can connect to A2, A4
B1 can connect to A3

So here the maximum number of edges that need to out of a single Bs node is 2. We cannot cover all As and at the same time have a B node not having 2 edges going out of it to cover As.

Another example:

A1 B1
A2 B2
A3 B3
A4 B4

B1 -> A1, A2, A3
B2 -> A1, A2, A3, A4
B3 -> A1, A2, A3
B4 -> A1, A2, A3

In this case the answer would be:

B1 can connect to A1
B2 can connect to A4
B3 can connect to A3
B2 can connect to A2

This way we will cover all the As exactly once and at the same time we have minimized the maximum number of edges that need to go out of individual B's. So here the maximum number of edges that need to out of a single Bs node is 1.

Another example:

A1 B1
A2 B2
A3 B3
A4
A5
A6

B1 -> A6
B2 -> A1, A2, A3, A4, A5
B3 -> 

In this case the answer would be 5 i.e. the maximum number of edges that need to go out of a single Bs is 5. Can't do less than that.

I have implemented basic ford fulkerson algorithm and I know this is also network flow but don't know how to relate to it.

It will be great if someone can give some hint about the graph.

Thanks

Upvotes: 2

Views: 530

Answers (2)

amit
amit

Reputation: 178521

Finding an optimal solution - with all B's have at most one out edge (if one exists) is simple:

  • Add a source and a sink to the graph. The source will have an out edge with capacity 1 to all vertices on B's list.
  • All (B,A) edges will have a capacity of 1.
  • All A's will have an out edge with capacity 1 to the sink.
  • Now, running a flow algorithm will yield the maximal number of vertices in A that can be covered with each B having only a single out going edge (optimal solution, if one exists)

EDIT:

Now, based on the above idea, and since you are trying to minimize the maximum number of edges from a single B to A (and NOT the total number of them, as I previously thought), an optimal solution is simple:

while there is no coverage:
   set capacity(source,b_k) = increase_size() (for each b_k in B)
   run max flow algorithm on the graph suggested above
return last flow found

Complexity is O(E*V*#iterations) (In this problem f <= V, thus the complexity if ford-fulkerson is O(EV)), where #iterations can be done linear in the minimal maximum number you seek, or using exponential increase, and then binary search on the range (as suggested by Evkeny Kluev), in log of this number.
Since E=O(V) in bipartite graph, we get total of O(V^2*log(V))

Upvotes: 3

Evgeny Kluev
Evgeny Kluev

Reputation: 24677

Connect all A's to one common sink node with edges of capacity 1. Connect all B's to one common source node with edges of variable capacity C.

Find maximal network flow in this graph, increasing C when not every A is covered and decreasing it otherwise. Which means find optimal value for C using binary search.

Upvotes: 2

Related Questions