Reputation: 2761
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
Reputation: 178521
Finding an optimal solution - with all B's have at most one out edge (if one exists) is simple:
(B,A)
edges will have a capacity of 1.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
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