Problem:
Bipartite Matching

A bipartite graph G = (V, E) is a graph in which the vertex set V can be divided into two disjoint subsets X and Y such that every edge e ∈ E has one end point in X and the other end point in Y.

A matching M is a subset of edges such that each node in V appears in at most one edge in M.

Given a bipartite graph, find the size of the matching which has the largest size.

Input

|X| |Y| |E|
x0 y0
x1 y1
:
x|E|-1 y|E|-1

|X| and |Y| are the number of vertices in X and Y respectively, and |E| is the number of edges in the graph G. The vertices in X are named with the numbers 0, 1,..., |X|-1, and vertices in Y are named with the numbers 0, 1,..., |Y|-1, respectively.

xi and yi are the node numbers from X and Y respectevely which represent the end-points of the i-th edge.

Output

Print the largest size of the matching.

Constraints

1 ≤ |X|, |Y| ≤ 100

0 ≤ |E| ≤ 10,000

Sample Input 1

3 4 6
0 0
0 2
0 3
1 1
2 1
2 3

Sample Output 1

3

Solution in Ruby (judge verdict: Wrong Answer)

#!/usr/bin/env ruby



$visited = []
$pre_vertex = []


def min a,b
  if a<b then return a else b end
end

def init_dfs v,e
  $visited = Array.new(v,false)
  $pre_vertex = Array.new(v,false)
end

#b -> e ??§edges
def dfs b,e,es
  es[b].each_with_index do |c,v|
    if !$visited[v] and c>0 then
      $visited[v] = true
      $pre_vertex[v] = b
      if v==e then
        return
      end
      dfs(v,e,es)
    end
  end
end


def back_trace b,e,es
  flow =[]
  min_c = 10e8

  to = e
  from = $pre_vertex[e]
  flow=[[from,to]]+flow
  min_c = min(min_c,es[from][to])

  while from != b
    to = from
    from = $pre_vertex[from]
    flow=[[from,to]]+flow
    min_c = min(min_c,es[from][to])
  end
  return flow,min_c
end



#v_size,e_size = gets.chomp.split(/ /).map{|i| i.to_i}

x_size,y_size,e_size = gets.chomp.split(/ /).map{|i| i.to_i}

edges = Array.new(x_size+y_size+2).map{ Array.new(x_size+y_size+2,0)}


e_size.times do
  u,v = gets.chomp.split(/ /).map{|i| i.to_i}
  edges[u][v] = 1
end
x_size.times do |i|
  edges[x_size+y_size][i] = 1
end
y_size.times do |i|
  edges[i][x_size+y_size+1] = 1
end

@ans = 0
v_size = x_size+y_size+2
loop do

  init_dfs(v_size,e_size)
  dfs(x_size+y_size,x_size+y_size+1,edges)
  if $visited[v_size-1] then
    f,min_c = back_trace(x_size+y_size,x_size+y_size+1,edges)
    f.each do |i|
      edges[i[0]][i[1]]=0
      edges[i[1]][i[0]]=1
    end
    @ans = @ans+ min_c
  else
    p @ans
    break
  end
end