You can solve bipartite matching using max flow. Create a source connected to all vertices in with capacity . Connect all vertices in to a sink with capacity . Use the original edges with capacity .
The max flow from to equals the maximum matching size. Each unit of flow corresponds to one matched pair. This works because capacities force each vertex to participate in at most one edge.