{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Bipartite Matching"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Bipartite Matching問題を解くアルゴリズムを実装してみる。Figure 8のような二部グラフをまずは作成する。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "code_folding": [
     0
    ],
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgoAAAFkCAYAAABB1xPiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xt4VNXd9vHvhIEA4qGK0IKgIVEkQAVEwFrpw1tAQtGq\n8Ihia9UQObSIhz5aBbUoKdpWixyDxmOLFRSlFYEa8ASKiEhVGFQSItiCIAeFQIjZybx//GaYScjk\nxEyyJ7k/18WVyZo9ey+UWXPPWmuv5fH7/X5EREREKpBQ3xUQERER91JQEBERkYgUFERERCQiBQUR\nERGJSEFBREREIlJQEBERkYgUFERERCQiBQURERGJSEFBREREIlJQEBERkYgUFERERCQiBQURERGJ\nSEFBREREIlJQEBERkYgUFERERCQiBQURERGJSEFBREREIlJQEBERkYgUFERERCQiBQURERGJSEFB\nREREIlJQEBERkYgUFERERCQiBQURERGJSEFBREREIlJQEBERkYgUFERERCQiBQURERGJSEFBRERE\nIlJQEBERkYgUFERERCQiBQURERGJSEFBREREIlJQEBERkYgUFERERCQiBQURERGJSEFBREREIlJQ\nEBERkYgUFERERCQiBQURERGJSEFBREREIlJQEBERkYgUFERERCQiBQURERGJSEFBREREIlJQEBER\nkYgUFERERCQib31XQI5PQUEBubm5FBUVkZiYSEpKCq1atarvaomI1JraNXdRUIhDPp+PrKwscpYu\n5bOtW/H7/Uef83g8dO7UiUFDhzJ27FhSU1PrsaYiItWjds29PP7w/xviavn5+YwfM4blOTm08XoZ\n7jhcAKQCLYHDgA9YByzyetntOAwZNIg58+aRlJRUn1UXEamQ2jX3U1CIE9nZ2dwyYQKtHYc/OA4j\ngGaVHP8d8CJwl9fLXq+X6TNnMnr06LqprIhINahdiw+azBgHMjMzycjI4JojR/jEcRhF5W8mAs+P\nAjY6DtccOUJGRgaZmZmxr6yISDWoXYsf6lFwuezsbDIyMngAmFzJcV8B04H3gQ+AAuBNoH/g+QeA\newPnS09Pj12FRUSqUN12LWgd8BTWvn0MlAT+qF2rGwoKLpafn0/31FSuOXKEx6s49i3g/wFnA62B\nNcAbhIKCH7gJ+Hvz5nzi82lsr7HYuxdSU2HdOujYsb5rE1JcDOecA4sWQa9e9V0bqUM1adeCpgDT\n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\nCXaLAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10f7c8a90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Figure 8のグラフを作成\n",
    "\n",
    "# もろもろをインポート\n",
    "import networkx as nx\n",
    "import matplotlib.pyplot as plt\n",
    "from collections import deque\n",
    "\n",
    "G = nx.DiGraph()\n",
    "edgelist = [('v1','w1'),('v1','w2'),('v2','w1'),('v2','w2'),('v3','w2'),('v4','w3'),('v4','w4'),('v5','w5'),('v5','w6')]\n",
    "G.add_edges_from(edgelist)\n",
    "for e in G.edges():\n",
    "    G[e[0]][e[1]]['capacity'] = 1\n",
    "    G[e[0]][e[1]]['flow'] = 0\n",
    "\n",
    "# 描画\n",
    "\n",
    "pos={'v1':(0,10),'v2':(0,8),'v3':(0,6),'v4':(0,4),'v5':(0,2),'w1':(2,10),'w2':(2,8),'w3':(2,6),'w4':(2,4),'w5':(2,2),'w6':(2,0)}\n",
    "edge_labels = {(i, j): (w['capacity'], str((w['flow'])) ) for i, j, w in G.edges(data=True)}\n",
    "nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_color='r')\n",
    "nx.draw_networkx_labels(G, pos)\n",
    "nx.draw(G, pos)\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# V,Wを設定。Gに加えてV,Wを与えれば二部グラフは定まる\n",
    "V = ['v1','v2','v3','v4','v5']\n",
    "W = ['w1','w2','w3','w4','w5','w6']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "code_folding": [],
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def add_st(G,V,W):\n",
    "    '''Just add a source s and a sink t to the original bipartite graph G.\n",
    "    \n",
    "    Parameters\n",
    "    ----------\n",
    "    G : bipartite graph\n",
    "    V,W : the lists of nodes, two groups of G\n",
    "    \n",
    "    Return\n",
    "    ------\n",
    "    H : modified graph    \n",
    "    \n",
    "    '''\n",
    "    H = G.copy()\n",
    "    H.add_nodes_from(['s','t'])\n",
    "    for p in V:\n",
    "        H.add_edge('s', p)\n",
    "        H['s'][p]['flow'] = 0\n",
    "        H['s'][p]['capacity'] = 1\n",
    "    for p in W:\n",
    "        H.add_edge(p, 't')\n",
    "        H[p]['t']['flow'] = 0\n",
    "        H[p]['t']['capacity'] = 1\n",
    "        \n",
    "    return H"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "G0 = add_st(G,V,W)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "code_folding": [
     0
    ],
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nwYAxxhgT4v4fqPNJJtC3cQEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10fc21470>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# s,tを加えたグラフを描画\n",
    "\n",
    "pos={'s':(-1,5),'t':(3,5),'v1':(0,10),'v2':(0,8),'v3':(0,6),'v4':(0,4),'v5':(0,2),'w1':(2,10),'w2':(2,8),'w3':(2,6),'w4':(2,4),'w5':(2,2),'w6':(2,0)}\n",
    "edge_labels = {(i, j): (w['capacity'], str((w['flow'])) ) for i, j, w in G0.edges(data=True)}\n",
    "nx.draw_networkx_edge_labels(G0, pos, edge_labels=edge_labels, font_color='r')\n",
    "nx.draw_networkx_labels(G0, pos)\n",
    "nx.draw(G0, pos)\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "まず、push-relabel algorithmを用いてbipartite matchingを解いてみる。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "code_folding": [
     3,
     23,
     63,
     98,
     108
    ],
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# ch03で作成したものたち\n",
    "import numpy as np\n",
    "\n",
    "def makeResidualGraph(G):\n",
    "    '''\n",
    "    Input: a graph G\n",
    "    Output: its residual graph Gf\n",
    "    '''\n",
    "    Gf = G.copy()\n",
    "    edgeList = G.edges()\n",
    "    \n",
    "    for edge in edgeList:\n",
    "        # Initialize flow\n",
    "        Gf[edge[0]][edge[1]]['flow'] = 0\n",
    "        \n",
    "        # 逆向きのedgeがないものは追加\n",
    "        if not (edge[1], edge[0]) in edgeList:\n",
    "            Gf.add_edge(edge[1],edge[0])\n",
    "            Gf[edge[1]][edge[0]]['capacity'] = Gf[edge[0]][edge[1]]['flow']\n",
    "            Gf[edge[1]][edge[0]]['flow'] = 0\n",
    "    \n",
    "    return Gf\n",
    "\n",
    "def Initialize(G, s, t):\n",
    "    '''\n",
    "    Inputs:\n",
    "        G: a residual graph\n",
    "            V: verteces\n",
    "                height\n",
    "                excess\n",
    "            E: edges\n",
    "                flow(preflow)\n",
    "                capacity\n",
    "                    NB: flow <= capacity\n",
    "        s: a start point\n",
    "        t: an end point\n",
    "    Output:\n",
    "        None\n",
    "    \n",
    "    Initialize the height and excess of each vertex.\n",
    "    '''\n",
    "    for v in G.nodes():\n",
    "        G.node[v]['excess'] = 0\n",
    "\n",
    "    for v in G.nodes():\n",
    "        # 始点以外の点について\n",
    "        if v != s:\n",
    "            G.node[v]['height'] = 0\n",
    "            # G.node[v]['excess'] = 0\n",
    "            for p in G.neighbors(v):\n",
    "                G[v][p]['flow'] = 0\n",
    "        # 始点について\n",
    "        else:\n",
    "            # 始点の高さをnに\n",
    "            G.node[v]['height'] = G.number_of_nodes() # n\n",
    "            # 始点から出る枝のpreflowをcapacityギリギリに\n",
    "            # このとき、始点に隣接する点のexcessを更新\n",
    "            for p in G.neighbors(v):\n",
    "                G[v][p]['flow'] = G[v][p]['capacity']\n",
    "                # backward edgeのcapacityの更新\n",
    "                G[p][v]['capacity'] = G[v][p]['flow']\n",
    "                G.node[p]['excess'] = G[v][p]['flow']\n",
    "\n",
    "def Push(G, v, w, forwardEdges):\n",
    "    '''\n",
    "    G: a graph(a residual graph)\n",
    "    v, w: vertices of G such that h(v) = h(w) + 1\n",
    "    forwardEdges: a list of the edges of the original graph\n",
    "    '''\n",
    "\n",
    "    # 更新量diffを計算\n",
    "    residualCapacity = G[v][w]['capacity'] - G[v][w]['flow']\n",
    "    diff = np.min([G.node[v]['excess'], residualCapacity])\n",
    "    \n",
    "    ''' for debugging\n",
    "    print(v)\n",
    "    print(w)\n",
    "    print('diff = ' + str(diff))\n",
    "    print('res.cap. = ' + str(residualCapacity))\n",
    "    print('excess of ' + v + ': ' + str(G.node[v]['excess']))\n",
    "    print('excess of ' + w + ': ' + str(G.node[w]['excess']))\n",
    "    '''\n",
    "    \n",
    "    # (v,w), (w,v)を更新, p.3を参考に\n",
    "    if (v,w) in forwardEdges:\n",
    "        G[v][w]['flow'] += diff\n",
    "        G[w][v]['capacity'] += diff\n",
    "        G.node[v]['excess'] -= diff\n",
    "        G.node[w]['excess'] += diff\n",
    "    else:\n",
    "        # このとき、(w,v)がforward edge、(v,w)がbackward edge\n",
    "        G[w][v]['flow'] -= diff\n",
    "        G[v][w]['capacity'] -= diff\n",
    "        G.node[w]['excess'] += diff\n",
    "        G.node[v]['excess'] -= diff\n",
    "        \n",
    "        \n",
    "\n",
    "def loopCondition(G, s, t):\n",
    "    nodelist = G.nodes()\n",
    "    nodelist.remove(s)\n",
    "    nodelist.remove(t)\n",
    "\n",
    "    for v in nodelist:\n",
    "        if(G.node[v]['excess'] > 0):\n",
    "            return True\n",
    "    return False\n",
    "\n",
    "def PushRelabel(G, s, t):\n",
    "    '''\n",
    "    Inputs:\n",
    "        G: a graph\n",
    "        s: a starting point\n",
    "        t: an end point\n",
    "    Output:\n",
    "        the graph G with its maximum flow\n",
    "    '''\n",
    "\n",
    "    # Forward Edges を記録\n",
    "    forwardEdges = G.edges()\n",
    "\n",
    "    # s,tを除いたnodeのlistを作る\n",
    "    nodeList = G.nodes()\n",
    "    nodeList.remove(s)\n",
    "    nodeList.remove(t)\n",
    "\n",
    "    # residual graph の作成\n",
    "    Gf = makeResidualGraph(G)\n",
    "\n",
    "    # Initialization\n",
    "    Initialize(Gf, s, t)\n",
    "\n",
    "    # Main Loop\n",
    "    while(loopCondition(Gf, s, t)):\n",
    "        # 高さが最も高く、かつexcess > 0の点vを探す\n",
    "        height = -100 # 適当に負の値を設定\n",
    "        for p in nodeList:\n",
    "            if(Gf.node[p]['excess'] > 0 and Gf.node[p]['height'] > height):\n",
    "                v = p\n",
    "                height = Gf.node[p]['height']\n",
    "\n",
    "        # h(v) = h(w) + 1 を満たす点wを探す\n",
    "        # vのneighborsの中から探す(そうじゃないとkey eroorに)\n",
    "        w = None\n",
    "        for p in Gf.neighbors(v):\n",
    "            if(Gf.node[v]['height'] == Gf.node[p]['height'] + 1 and (Gf[v][p]['capacity'] - Gf[v][p]['flow']) > 0):\n",
    "                w = p\n",
    "                break\n",
    "\n",
    "        # そのような点wがない場合、increment h(v)\n",
    "        if w == None:\n",
    "            Gf.node[v]['height'] += 1\n",
    "\n",
    "        # ある場合\n",
    "        else:\n",
    "            Push(Gf, v, w, forwardEdges)\n",
    "\n",
    "    # もともと無かったedgeを消去\n",
    "    for edge in Gf.edges():\n",
    "        if not edge in forwardEdges:\n",
    "            Gf.remove_edge(edge[0],edge[1])\n",
    "    \n",
    "    return Gf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "code_folding": [
     0
    ],
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def biMatch_pr(G,V,W):\n",
    "    '''Calculate the perfect matching of (G,V,W) by using push-relabel algorithm.\n",
    "    \n",
    "    Parameters\n",
    "    ----------\n",
    "    G : bipartite graph\n",
    "    V,W : the lists of nodes, two groups of G\n",
    "    \n",
    "    Return\n",
    "    ------\n",
    "    G : modified graph with perfect matching \n",
    "    '''\n",
    "    \n",
    "    H = add_st(G,V,W)\n",
    "    I = PushRelabel(H, 's', 't')\n",
    "    I.remove_node('s')\n",
    "    I.remove_node('t')\n",
    "    \n",
    "    return I"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "v4\n",
      "w3\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v4: 1\n",
      "excess of w3: 0\n",
      "w3\n",
      "t\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w3: 1\n",
      "excess of t: 0\n",
      "v5\n",
      "w5\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v5: 1\n",
      "excess of w5: 0\n",
      "v3\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v3: 1\n",
      "excess of w2: 0\n",
      "w5\n",
      "t\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w5: 1\n",
      "excess of t: 1\n",
      "w2\n",
      "t\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of t: 2\n",
      "v2\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "t\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of t: 3\n",
      "v1\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v1: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "v2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of v2: 0\n",
      "v2\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w2: 0\n",
      "w2\n",
      "v3\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of v3: 0\n",
      "v3\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v3: 1\n",
      "excess of w2: 0\n",
      "w2\n",
      "v2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of v2: 0\n",
      "v2\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "v1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of v1: 0\n",
      "v1\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v1: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "v2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of v2: 0\n",
      "v2\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w2: 0\n",
      "w2\n",
      "v3\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of v3: 0\n",
      "v3\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v3: 1\n",
      "excess of w2: 0\n",
      "w2\n",
      "v2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of v2: 0\n",
      "v2\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "v1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of v1: 0\n",
      "v1\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v1: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "v2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of v2: 0\n",
      "v2\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w2: 0\n",
      "w2\n",
      "v3\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of v3: 0\n",
      "v3\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v3: 1\n",
      "excess of w2: 0\n",
      "w2\n",
      "v2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of v2: 0\n",
      "v2\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "v1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of v1: 0\n",
      "v1\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v1: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "v2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of v2: 0\n",
      "v2\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w2: 0\n",
      "w2\n",
      "v3\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of v3: 0\n",
      "v3\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v3: 1\n",
      "excess of w2: 0\n",
      "w2\n",
      "v2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of v2: 0\n",
      "v2\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "v1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of v1: 0\n",
      "v1\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v1: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "v2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of v2: 0\n",
      "v2\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w2: 0\n",
      "w2\n",
      "v3\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of v3: 0\n",
      "v3\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v3: 1\n",
      "excess of w2: 0\n",
      "w2\n",
      "v2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of v2: 0\n",
      "v2\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "v1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of v1: 0\n",
      "v1\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v1: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "v2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of v2: 0\n",
      "v2\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w2: 0\n",
      "w2\n",
      "v3\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of v3: 0\n",
      "v3\n",
      "w2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v3: 1\n",
      "excess of w2: 0\n",
      "w2\n",
      "v2\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w2: 1\n",
      "excess of v2: 0\n",
      "v2\n",
      "w1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v2: 1\n",
      "excess of w1: 0\n",
      "w1\n",
      "v1\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of w1: 1\n",
      "excess of v1: 0\n",
      "v1\n",
      "s\n",
      "diff = 1\n",
      "res.cap. = 1\n",
      "excess of v1: 1\n",
      "excess of s: 0\n"
     ]
    }
   ],
   "source": [
    "H = biMatch_pr(G,V,W)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgoAAAFkCAYAAABB1xPiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xl8VNX9//HXwEgCoqIitCgoJIoCKiqbtdovPwEJVWsL\nX1GsVhuQpUVc+sWquKBEtHVB1mDjhkVFRa0ioAEXwCICUhUGkYQIVhRkUQiEkJvM74/PDDNJZrIx\nk9xJ3s/Hg0dmzty5c6KZM+8559xzPH6/34+IiIhIBI3qugIiIiLiXgoKIiIiEpWCgoiIiESloCAi\nIiJRKSiIiIhIVAoKIiIiEpWCgoiIiESloCAiIiJRKSiIiIhIVAoKIiIiEpWCgoiIiESloCAiIiJR\nKSiIiIhIVAoKIiIiEpWCgoiIiESloCAiIiJRKSiIiIhIVAoKIiIiEpWCgoiIiESloCAiIiJRKSiI\niIhIVAoKIiIiEpWCgoiIiESloCAiIiJRKSiIiIhIVAoKIiIiEpWCgoiIiESloCAiIiJRKSiIiIhI\nVAoKIiIiEpWCgoiIiESloCAiIiJRKSiIiIhIVAoKIiIiEpWCgoiIiESloCAiIiJRKSiIiIhIVAoK\nIiIiEpWCgoiIiESloCAiIiJRKSiIiIhIVAoKIiIiEpWCgoiIiESloCAiIiJRKSiIiIhIVAoKIiIi\nEpWCgoiIiETlresKyOHJz88nJyeHwsJCkpKSSE1NpXnz5nVdLRGRGlO75i4KCgnI5/ORmZlJ9vz5\nbNi0Cb/ff+gxj8dDxw4d6DtgACNGjKBTp051WFMRkapRu+ZeHn/4/w1xtby8PEYNH87C7Gxaeb0M\ndBy6A52AZsB+wAesBOZ6vWx3HPr37cv0mTNp3759XVZdRCQitWvup6CQILKysrh59GhaOg4POg6D\ngCYVHH8QeBW4w+tlp9fLpClTGDp0aO1UVkSkCtSuJQZNZkwAGRkZDBs2jKsPHOALx2EIFb+ZCDw+\nBFjrOFx94ADDhg0jIyMj/pUVEakCtWuJQz0KLpeVlcWwYcN4ABhXwXHfA5OAT4BVQD7wAXBR4PEH\ngHsC50tPT49fhUVEKlHVdi1oJfAM1r59DhQH/qldqx0KCi6Wl5fHmZ06cfWBA/yjkmM/BP4fcCrQ\nElgOvE8oKPiBG4EXk5P5wufT2F5DsXMndOoEK1dCu3Z1XZuQoiI47TSYOxfOPbeuayO1qDrtWtB4\nYCJwFrAX+AoLCmrXaoeGHlxs1PDhtHQcHqvCsd2AncCXwC0RHvcAjwLHOw6jhg+PYS3F1TIy4Ior\nSoeEMWOgWzdITq75h/T48fDHP5YumzYN2reHpk2hVy8LJ+F694ZZs+z2EUfA//0fjB1bs9eXhFWd\ndu3Qc4CfsB6FPmHlatdqh4KCS/l8PhZmZ3OF43AMsDTCMTOx/4E+4EigRSXnPBqY6DgszM5m/fr1\nsa2wuE9BATz9NJSd7OXxQHo6XHVV7F5rzhy47TYLEGvWwNlnwyWXwI4d0Z8zZAgsWwb6W2ww3njj\nDRZmZzPIcTgqUPYp1o51K3NsGnB+4PYJQFKUc6pdiz8FBZfKzMykldfL/UBz4OUIx7wMdMEuI6qq\ngUArr5cZM2bEoJbiam+/bb0G3buXLp80CUaOtG//sfL44zB8OFx3HZx+OmRmQrNmFlSiadECLrgA\nXnopdvUQV1u8eDEebMggaCn2QfQZNreKwOPLgV9V8bxq1+JLCy65VPb8+Qx0HI4GLsMuCZqMdbUB\nbMPmJdxfzfMmAQMdh0ULFsSsruJSy5bBeefF/3WKimD1arjzzlCZxwN9+sDy5aXLyurRA5ZG6i+r\nX84///zKD2oA1q5ZQzvg32FlS4HfAv8KlPcD/gPsAX5ZxfOqXYsvBQUX2rt3Lxs2bSI4ejsYeAm7\niqF3oOwVLHVfWYPzdwMyc3PJz8/Xsqj12ebN0KZNfM59772h2zt2QHExtG5d+pjWrWHDhtD9994r\nf542baye9dzHH39c11VwjTQsFBQATYFl2ETFr7HQ0I9QL0NVgwKoXYsnBQUXys3Nxe/3HxpS6I+N\nw80hFBReBroCqTU4f2fA7/fz1ltv0bFjx8Our9StLl260KRJhCvQCwps6MHNmjaF/fsjPuT3+1mz\nZk0tV0jirR/WQ7ocOAn4AbgQWEtoLtYybEi1snlX4YLtWk5ODl27do1dhUVBwY0KCwsBW74UbJGR\nK4DXgenAd8BHwEM1PH/TwM8hQ4bUvJLiGlu2bKFt27blH2jZEnbvjn8FWraExo1h27bS5du2wc9+\nVvFzd+2CE06I+FBxcTHn1cbQidSqc4FkYAnQFmiFfeG5EJiBrb64FPhdNc8bbNeC7afEjoKCCyUl\n2fze8O9Zg4FZwGJgXaCsJsMOYF1+AF6vl5NOOol27drRtm1b2rZte+h269atady4cQ1fQWpT67Jd\n/kHnnAOzZ8e/AkccYXMhFi+Gyy+3Mr/f7t90U8XPXbvW6hlB48aNWb16dYwrWzcUeEKKgB5YUGiH\nBQQCPwuB2dgcrIsiPju6YLsWbD8ldhQUXCg1NRWPx4PP76dnoKwPcCw2V2E99kY7uYbnX4dNinzo\noYfYsmULGzdu5JNPPmHOnDk4jgNAkyZN6NChA6eeeiqpqamceuqph263bdtWISIRXHKJTTD86Sc4\n5phQeW4u7N0L331nwxOffWblnTuDt4ZNwq23wvXXW2Do0cOugti/38oqsnSprfUQgcfj4dx6shhT\nr1696roKhziOQ0FBAYWFhRQUFHDgwIFD/4qLi+P++j4sFDwGbAJuC5QfD5wOPIy1TxdGfHZ067C/\nmdTUmgzISkW0MqNLnZGaSu/cXKaHld2IBYX92CIjY8o8ZwL2BlsXOO6PQPACuLvCjhsFfJCaim/j\nxlLPdxyHzZs3s3HjRnJycti4ceOh23l5eQoRiej8821hpGHDQmW9e8OSJeWPzcsLLczUqBE8+6xd\n7lhV06fD3/5mQw5du8KUKbawUzTLl8Oll8LWraBvgTG1a9euiO/jjRs3srs2hqOiOAIYig2l9sfa\nq9XYfCuAkdj6MO2B3LDnbQGeD9yehy28FLzi62Tg90Rv1+TwKSi41E033cScGTP4xnEObZSyGJsI\n1AjYDJSdz96I0OWT4TyAE7hdCLTzehk8ciSTJ0+ucn0UIhLU/Pm2+uHatVV/Tl6erYXg80FKSvzq\ndtVVNuxw++3xe416zK1hAKz7PzU19VAbEPz5/PPPM/+f/2S949AaWyNmF6F26wXgWuA6bG+HoA+x\nidyR2rdfAQuoWbsmVaOg4FI+n4/OnTszG9stLVZeAK4JnP+MM86IyTkVIlxu8mQYOBBOPLFqx0+f\nbqslTpkSvzoVFcHf/26rOao3IapEDAOnnnoqJ554Io0alV/PL5HaNQlRUHCxtH79WP/++3wRttzp\n4dgDnOn10ql3bxa8+24Mzlg5hQiRitW3MFCZ+tCuNTQKCi5Wk13WonHjLmsKEdJQNLQwUJH63q7V\nR7rqwcXat2/PpClTGDZsGCdTtX3bI/FjEx2zgKypU13zZvJ6vaSkpJASYRw8WoiYN2+eQoQklEWL\nFtG3b986rUNycjIpKSnl3iPxCgMVqe/tWn2koOByQ4cOZdu2bYwbN47N2CVF1emu24NdfpQFZGRk\nkJ6eHo9qxpxChNQXHTp0qJXXcVMYqExDbdcSlYYeEkRWVhY3jx7N8Y7DRMdhEBBh0d5DCoG5wB1e\nLzu9Xp6YOrVBvJk0nBGF32/7MYBd+tiokZUFN2oqLoaSErvduLE9XlOB/8Y0blx6I6iSEnudRo3s\nsXqmpKSErVu3lvrby8nJ4auvvmLdunWVn6AKEikMVIXatcSgoJBA8vLyGDV8OAuzs2nl9TLQceiG\nrXHeFFuZbB2wCpjr9bLdcejfty/TZ85UtxwNPET85z/w9ddw9tmRt5d2HFuA6eOPIT8fhgyp+GqE\nkpLyYSJYtmsXfPCBvU6XLrZyI9iVDmvXwpdf2mJQxx0Xq9+u1kQLAxs3biQ3N5eCAlsfsFGjRpx8\n8smH/m5eeeUVfvjhhyq9Rn0LA5VRu+Z+CgoJyOfzkZmZyaIFC/gysIFUkMfj4fSUFPqkpTFy5Ehd\nKlRF9TpE7N8PI0bYt/l//tO+5Qd7E8J7FZ5/HmbNghkzIDW19GORHDhgx/fpA8Hu9eBzHn/cgsAf\n/lD6OStWwLhxttDSmLJLhrlDTcNA+M9TTjml1FLCl156KW+//fah+w0tDFSF2jX3UlBIcPn5+eTk\n5FBYWHho9rK2WI2thA8R27fbB/lrr0G/fpF7A1assF6AP/8Zjjyy8nN+8IEtz7xlCzz0kO3pkJxs\nYaSy33PQIAsRTz4ZuS61IB5hoCJvvvkm33//fYMPA1Wlds1dFBREDkNChIhZs+CZZ+D990uXB7/9\n79plww6dO1feiwAWDv76VzjpJPuQnzED3noLLoqwjU/ZeRCNG9tqkUOHwqZNcd0Gu7bDgEh9paAg\nEieuCRFz50JmJvzrX9C0afkgcPCgfeBXtiHUvn3W27B9O7zzDpx1ls156NEDmje3oYuqrP64ejXc\nd5/VqaqrRUahMCASfwoKInWgVkPE7Nn24X7LLXbf77cNmX7xC7tfWfe/3w9PPQVr1sC0aVZWWBia\n7JibCx07wgMP2GtU1kuwc6ftavm3v5Xe1TIKhQGRuqWgIOIy1Q0R99xzD1dddRWeaEMG+/bZxMPj\nj7dQsGWLzRE48siqX6Y4fTosWgRXXmmbOYUqaz0RDz8MEybA22+HhiAiTZgM3t66FdqU3dYspKSk\nhPfee49bbrlFYUCkjikoiCSQSCEiJyeHP//5z6SlpeH3+6MHhnBVmYsQftyuXTBpEqxaBY8+CsFZ\n5+Hn6d4djjoKXnzRhjPmzYNrr7VhiWooKSlh9erVjB8/vlwoUBgQqX0KCiL1RHFx8aGQEJcZ9UuW\nwLvvwqhRpXsDgr0KeXnQqZOtkZCdDRdfbKGhKldRYAHB4/FQXFyMt7L5EiJSaxQURCQ2CgpsgaWt\nW2HiRLj55rqukYjEgGK7iFRPpGGLDRvs6ocOHWDZMvj5z628KusqiIirqUdBRA7f9u122WNamt1X\nQBCpNxQURBqSsh/gVZ3UWB3BOQsiUi9oDVGRBFdSUsK33357aNOhkuAukJE0bmyXSt5+O3z2mYWE\n4K6SsVJZSIjy3ST4nWX37t188803FMe6XiJSI4r9IgmgokWHduzYwbJly2jdujVQyRUPH31kyydv\n2ADr18Obb1p4iEfPQiQVDEkEr9ho3rw5xcXFnHbaaTRp0sR9e2eINDAaehBxiZquQHjLLbfQoUOH\nyi+J3LEDbrwRWra0lRRnzYJrroGxYyMHhViFh+B5nnrKLq+cOhVOOKHCp5SUlPDDDz/w4IMPum/v\nDJEGRkFBpBbV2nLEfr8tkvTHP9oSzsFFj2bPtsWSUlIgI8MWRZo9G845J/q3/YMHoUmT6v+yjmPn\n83jgiy/scslf/xrS023p5mnTrJ5//nMVT+eSvTNEGhgFBZEYc83eBCUl0LOnfSD36FH+8RUrYPx4\n2+dh3jwrK9uL8PDDsHcv3H9/9baDLimB778PLczUrx+ccortOtmhg5VlZNieEfffX6NfL5xChEj8\naI6CSA3UJAxcdNFFpKen195yxFu32of7wYPBStv9YBjo2RMGD4ZHHrENmsaOLT/U8N13trrihAlV\ne82SEjv/iy9C//6h8muusbUVgiEB4PPPbf+JGPB6vaSkpJCSklLusWghYt68eQoRIlWgHgWRKFzT\nM3A40tKgVSt47rnS5cGwsGOH9RrMnw8vvWQf5k89ZbtANmkC33wD118PU6bY8swVKSkBnw9efRUu\nvRS6dSs9nBHeW/HVV9CnD7zwAvzyl7U3mbKM2uqJmDhxIp999lm5v48TTjihantziNQhBYUEl5+f\nT05ODoWFhSQlJZGamkrzam7C05DVizBQkWeftc2cnnsOzj478pbSq1bZEEROji2c1KqVlR15JHz7\nrW0jHdwRMpqSErvccutWm4dQmWnT4LXXbIOprl1r/OvFUyxDxMUXX8x7771X7jWOPvrocn9PChFq\n19xGQSEB+Xw+MjMzyZ4/nw2bNhH+v9Dj8dCxQwf6DhjAiBEj6FTZt8AGoN6HgYocOGCTGpOT4dhj\ny2/7DFBUZPMJHMe2nz7mmKqfvyY9AUVFsHOnPS9wSWeiqW6I+Prrrzlw4EC1XqOhhQi1a+6loJBA\n8vLyGDV8OAuzs2nl9TLQcegOdAKaAfsBH7ASmOv1st1x6N+3L9NnzqR9+/Z1WfW4a9BhQFylbIhY\nv34906dPj+lr1KcQoXbN/RQUEkRWVhY3jx5NS8fhQcdhEFDRBWsHgVeBO7xednq9TJoyhaFDh9ZO\nZeNEYUAS0bp16+jSpUutvV4ihQi1a4lBQSEBZGRkMG7cOIYCjwFHVeO5e4FbgSxgwoQJ3HXXXfGo\nYswoDEh988knn3DjjTeyceNG9u/fX6d1cVOIaEjtWqJTUHC5rKwshg0bxgPAuMM4zwPAPYHzpaen\nx6ZyNaQwIA2R3+/nu+++K/c3H/zZkEJEfWzX6jMFBRfLy8vjzE6duPrAAf5RybHvAbOBZcB/gZ8B\n/w97I/0M8AM3Ai8mJ/OFzxf3sT2FAZGqa0ghojrtGljb9RzwOrAG2AW0B64CbgNGU3vtWkOloOBi\naf36sf799/nCcSrtlusO7Ab+FzgV2ARMAY4E/gO0AvYAZ3q9dOrdmwXvvnvY9VMYSAA7d9r6BytX\nQrt2dV2bkKIiOO00mDsXzj23rmvjavUtRFSnXQPYhw1LnA9cirVly4FngV9hASKW7ZqUp6DgUj6f\nj86dOzMbGFKF45cBvyxTthR7I40DgovkvgBcEzj/GWecUel5FQYS3K23wr59MHNmqGzMGNtFcu1a\nCxGfflr9844fD5s3w9NPh8qmTbNVHr//3tZsmDIFuncPPd67N9xwA1x3nd2fPt3WUli0qGa/myRc\niGjWrBl33XVXlds1gCJgNdCrTPkDwH1ANvA91WvXpHq0hLNLZWZm0srrpbHj0Aj4ELiwzDEzgZHA\nWsqHBALHHwesDysbCNzi9TJjxgwmT54MJMhyxFJ9BQX2QZ6dXbrc47GNmVassGWUY2HOHLjtNnjy\nSdtX4vHH4ZJLbAXGli0jP2fIEAsy69fbRlVSbR6PhzZt2tCmTRsuKrMolhtCxJ49e/j000/5tEwY\nbRp2+1OgG3AusCqsPA34Ees9KBsSAH4L3Iu1b0Mp365J7CgouFT2/PkMdBx+AzQHXqZ8UHgZ6IJd\nbxzJPiAfCG+mk4CBjsNLzz/Pf//7X4WB+uztt22hpfBv9WArNYKtwhiroPD44zB8eKi3IDPTXv/p\np20PiUhatIALLrClo8ePj009XOr888+v6yoc0rRpU8466yyKioooKCjgwIED5f6VlJTE5bW9QGPs\nw/+3gbKlQCPgM6y9ao7NS1gOjKjgXN8FfrYk1K4tWrAgDrUWBQUX2rt3Lxs2bWIskAxchl07PBkI\njvZtw3oZKtp373Gs2+6qMuXdgBk//shPP/2kMFCfLVsG550X/9cpKoLVq+HOO0NlHo/t5bB8eemy\nsnr0gKVL41/HOvbxxx/XdRVcwQE6Y+EgaCkWGv4F/Bvoh82r2kPkntKgvwHHYD0PYO1aZm4u+fn5\nWu45xhQUXCg3Nxe/33+op2Aw8BLwAdA7UPYKlrqvjHKOJViIGIzNUwjXOfBz6NChdOzY8VD5vn37\nWLdu3WHXX2pXly5daNIkwjI1mzeHtnmOtXvvDd3escM2fyq7HHPr1rBhQ+h+hL0OaNPG6hmB3+9n\nzZo1MaisuMkvgX8ABdgQxDJgIvA1Fhr6EepliBYUHsSu9JoBHB0o64z9zeTk5NDVpfuHJCoFBRcq\nLCwEbPlSgP7Ym2EOoaDwMtAVSI3w/C+B3wFnQcTLj4Ljg0OGVHU6kbjZli1baNu2bfkHCgps6MHN\nmjaFKGPlxcXFnFcbPSJSq3oB07GhhZOAH7Bh1bWEehqWYUOqLSI8fw5wNzYv4caw8mC7Fmw/JXYU\nFFwo2PUfbD6bAFdglwFNx8bmPgIeivDcb7BEfizwNnZ5ZFkFgZ8vvPBCqR4FSUyto22s1LIl7N4d\n/wq0bGlbSW/bVrp82zb42c8qfu6uXXDCCREfaty4MatXr45RJeuWAk9Ie2xIdQnQFrvcMRULCzOw\nZZqXYl92ysoG/oANx84o81iwXdPQaewpKLhQamoqHo8Hn99Pz0DZYGAWsBgIDg6UHXbYhYUEBxum\niLYv3zpstvRll12msbz67JxzYPbs+L/OEUfYXIjFi+Hyy63M77f7N91U8XPXrrV6RuDxeDi3nqyx\n0KtXpHn7dctxnFITGMMnNhYXF8ftdb8CemBBoR2hSdoXAoXYwnHbgLIbm6/AwkMPrFehzGbph9q1\n1NRI/axyOBQUXKh58+Z07NCBlbm53BAo64P1EryEXQ7UAzg57Dn7sUk932EhoUMF518FnJ6SopBQ\n311yiU0w/Omn0ltH5+bC3r3w3Xc2PPHZZ1beuTN4a9gk3HorXH+9BYbg5ZH791tZRZYuhYyMmr1m\nAlkePqmzFu3atavUFtjhP3fXRm9TGUdgu0BeiO3vsAlbXRHgeOB04GFs0nb4VV7rscWWOgBvYVc5\nlKV2LX4UFFyq74ABzJkxg0mOQxPsf9TvsKCwH3i0zPFDsDdgOpasw6ckNgd+E7hdiG3VOjgtDann\nunSxVQ9ffhmGDQuVDx0KS5aE7ge/teflhVZvbNQInn02dLljZa680iY13nOPDTl07QrvvBN1WAGw\nKyL27IGBA6v1a0lpbgsD4ZKTk0lJSTl0VdXq1at59cMPeaakhAJsqDQ8EFyErQ/THghOw80HLsHW\nVBgLzCvzGinAOahdiyetzOhSkVZmXIwNLTQCNhN6I4G9sbZEOdfJWHKH6q/MKAlu/nxbx2Dt2qo/\nJy8PTj8dfD5ISYlf3a66yoYdbr89fq9RTyRSGAhflfXEE0+kUaPQIEGwXXsKGI59idlF6LLvF4Br\ngeuAZwJlm6m4h/QPWI+r2rX4UVBwsequiV6ZWO/1IAli8mT71n7iiVU7fvp0Wy1xypT41amoCP7+\nd1vNUZPPgPoTBiqjdi3xKCi4WHV3WatIbe8eKSLlNZQwUBG1a4lHcxRcrH379kyaMoVhw4ZxMjXf\nt90PTACygKypU/VmEqlFq1at4k9/+pOrwkCkzdtiGQYqonYt8SgouNzQoUPZtm0b48aNYzM2U7g6\n3XV7sFnFWUBGRgbp6enxqKaIRJGcnMwnn3xSq69X12GgMmrXEouGHhJEVlYWN48ezfGOw0THYRC2\nEFM0hcBc4A6vl51eL09Mnao3k0gtKLsbq8/nY1JwI64YSYQwUBVq1xKDgkICycvLY9Tw4SzMzqaV\n18tAx6EbtsZ5U2xlsnXY9cRzvV62Ow79+/Zl+syZ6paT2PL7y2/yFCwrKrK1G5KToVkzu9QSoKTE\n1lbYvx+OPdYWakpQ1d2afevWrdVeWri+hIHKqF1zPwWFBOTz+cjMzGTRggV8GdhAKsjj8XB6Sgp9\n0tIYOXKkLhWS+DlwAGbNsl0iOwQuYAuGhccfh+OOgz/8ofRzVqyAcePg0kthzJjar3M1VDcMRPpA\nb9++PU2aNKF379588MEH5V6joYSBqlC75l4KCgkuPz+fnJwcCgsLSUpKIjU1VSuTSfx98IGturhl\nCzz0kC3VnJxsu0g2blzxcwcNshDx5JPWy1CHH4axDAMVuf/++1mzZk2DDwNVpXbNXRQURKR6tmyB\nv/4VTjrJPuRnzIC33oKLyq7OT+khimCImD/fVofctKlWdresrTAgUl8pKIhI1ezbB0ceCdu32/LM\nZ50FZ59tezs0bw7PP1+1RZ1Wr4b77oPMzKovAlUJhQGR+FFQEJGK+f3w1FOwZg1Mm2ZlhYWhFRVz\nc6FjR3jgAbjllsp7CXbutM2q/va30ptVVUJhQKRuKCiISOWmT4dFi2zzp6uuCpU7ju04+fDDMGEC\nvP12aAgiOOwQPvwQvL11K7RpU/51AkpKSti9ezcPP/ywwoBIHVNQEJHogh/su3bBpEmwahU8+igE\nZ52Hh4Du3eGoo+DFF+HgQZg3D6691oYlqqGoqIj8/Hy6deuG3+9XGBCpY1qZUUSiC4aA446zyyBL\nSkoPF3g8oV6Fl1+GTp1g+HDIzoaLL676NtUBfr+f/Px8du/ezfr16xUGRFxAPQoiEhsFBdCliw0r\nTJwIN99c1zUSkRhQj4KIVE+kVRk3bLCrHzp0gGXL4Oc/t/KqrKsgIq6mHgUROXzbt9tlj2lpdl8B\nQaTeUFAQaUjKfoBH6h04XME5CyJSL2jtUJF6oqSk5NC/qBo3tj0abr8dPvvMQkJxcWwropAgUq/o\nHS2SQCItOpSbm8v111/PZZddRklJScV7B3z0kS2fvGEDrF8Pb75p4SEePQsiUi9o6EHEZaq7AuHd\nd9/NDTfcUPmJd+yAG2+Eli1tJcVZs+Caa2Ds2Iq3jRaRBk1BQaQOxH05Yr/fFkn64x9h9uzQokez\nZ9tiSSkpkJFhiyLNng3nnBN9AuLBg6D1DEQaLAUFkTip870JSkqgZ0/bn6FHj/KPr1gB48fbDpDz\n5llZ2V6Ehx+GvXvh/vvrdDtoEak7mqMgchhqEgYuuugi0tPT478c8dat9uF+8GCwsnY/GAZ69oTB\ng+GRR2yDprFjyw81fPedLck8YULs6yciCUE9CiKVqPOegcORlgatWsFzz5UuD4aFHTus12D+fHjp\nJVso6amnbBfIJk3gm2/g+uthyhRbnllEGhwFhQSXn59PTk4OhYWFJCUlkZqaSvNqbsIjCR4GKvLs\ns7aZ03PPwdlnh3oVwq1aZUMQOTm2cFKrVlZ25JHw7be2jXRwR0iRWqB2zV009JCAfD4fmZmZZM+f\nz4ZNmwjPeh6Ph44dOtB3wABGjBhBJ30LPMTVwwTxctpptqHTnDlw1lmlhx6CWra0MPD117Yz5KhR\nocdOPNF1w2vgAAAgAElEQVT+icSZ2jX3Uo9CAsnLy2PU8OEszM6mldfLQMehO9AJaAbsB3zASmCu\n18t2x6F/375MnzmT9u3b12XVa0297Rk4HLfdBitXwpgxMHBg6cfWr4fLL4djj4XXXw+FAq2uKLVE\n7Zr7KSgkiKysLG4ePZqWjsODjsMgoKKPsoPAq8AdXi87vV4mTZnC0KFDa6eycaYwUE3ffAOjR8O+\nffDAA9CrV+mJjfPnw69/bcdqjwapRWrXEoOCQgLIyMhg3LhxDAUeA46qxnP3ArcCWcCECRO46667\n4lHFmFMYiLF//xsyM+GDD2DpUjjppPIrMiokSC1qiO1aolJQcLmsrCyGDRvGA8C4wzjPA8A9gfOl\np6fHpnKHSWGglu3ZA+npsHMndO5sVzKI1IH63K7VRwoKLpaXl8eZnTpx9YED/KOSY5cCjwBrgB+A\nFkBX4G7gF4AfuBF4MTmZL3y+WhvbUxhwoexseOYZGDQILr1Uqy5KrapOuxaUBfwT+BL4EWgD/A8W\nEjKo/XatoVFQcLG0fv1Y//77fOE4lXbLPQW8DXQHfgbsxt5YnwPzgX7AHuBMr5dOvXuz4N13Y1ZP\nhYEEUXaY4cABuwRSpBZVp10L+hNQAJwJHAvkAU8CJcAyoE8c2jUJUVBwKZ/PR+fOnZkNDKnhOQqA\nDsA5WFgAeAG4JnD+M844o8rnUhgQkcMVi3Yt6FOgG/AQcBI1a9ekanT9k0tlZmbSyuulsePQCPgQ\nuLDMMTOBkcBa7FKispoCJ2BddUEDgVu8XmbMmMHkyZNLHd8g1xkQkVozIbAUeNOwsuAH/rnAqrDy\nNKztWh7lXCcHfv4IjCF6uyaHT0HBpbLnz2eg4/AboDnwMuWDwstAF0qHhL3YJUQ7gOeAdUD4fOAk\nYKDj8NZrr3HmmWcqDIhIrfl0xQqSsA//3wbKlgKNgM+AfKy98weOGVHm+buAYmAzcD/gAS4m1K4t\nWrAg3r9Cg6ShBxfau3cvxxxzDE/5/dyAdam9B2zF3hgA24ATsTfLnWHPTQPeCdxuAvwRmETpa5Of\nBtKx1c5OOeUUDROISNwF27Wz/H6aEuopGIS1a/8C5mHzqdYA5wFvApeGnaMpUBi43RK4F5u/ANau\nDfV42LNnj5Z7jjH1KLhQbm4ufr//UE/BYOAl4AOgd6DsFSx1X1nmuQ8DfwG+wXoUDgJFlA4KnQM/\nV6xYQffu3WNefxFp2Hbt2lWqt3Ljxo189tln+P1+fgn8A5tD1RSbjDgR+BrrXehHqJfhl2XOuxA4\nAKzHJmvvC3usM+D3+8nJyaFr165x/O0aHgUFFyostMzcLHC/P3A0MIdQUHgZu/wxtcxzzwq7fQ02\n7ndD4Pig4PhgSUlJzOosIg1L2TAQHgp2794d9Xm9gOlYj8JJ2OXcF2JzrZYGjlmGDam2KPPcXwV+\nXgJcjg29NgdGEWrXgu2nxI6CggslJSUBtsY5WG/AFcDr2BvsO+AjbLZvRY7A3kwPY911SYHygjKv\nIyISSU3DQEXaA8nAEqAt0Ar7wnMhMAPrBV0K/K6S8wSv6JqNBQW1a/GjoOBCqampeDwefH4/PQNl\ng4FZwGJsgiKUH3aIZD82RLGXUFBYh81PSE0t2x8hIg1NtDCQk5PDrl27Yv56XwE9sKDQjtAk7Qux\nLzSzsTlYVdnYvAALFqB2LZ4UFFyoefPmdOzQgZW5udwQKOuDLTTyEjY+14PQ5UFg3XcnlDnPj8Bc\n7M3YMqx8FXB6Soom/Ig0ELUdBqI5AtsF8kJsf4dNwG2Bx44HTsd6QD2EAkQx9kWn7DDEJ8AXwO8D\n99WuxY+Cgkv1HTCAOTNmMMlxaIL9j/odFhT2A4+WOT4NG+/riXXlbQaexYYpwucnFGJbtQ5OS4vv\nLyAitcotYSCS5ORkUlJSKCgo4JW8PJ71+ynAJl2HX/Z9EbY+THtsmWawSybbYr2qnYEjsRVnn8W+\nPI1D7Vq86fJIl4q0gtlibEZwIywItAk7fgYWIoJroR8LnA/8H7bXQ1BNV2YUkbq3a9euUvME3BgG\nIl1ufeKJJ9KoUaND7dpTwHBsIuIuQpd9vwBcC1wHPBMoKwJuB97HrowowNq+vtgaMe1QuxZvCgou\nVpM10SsSr70eRKokfK8JiSrRw0Bl1K4lHgUFF6vJLmvR1NXukdKAPfMMvPee7VL5m9/UdW1cJTwM\nlA0F9SEMVETtWuLRHAUXa9++PZOmTGHYsGGcTM33bfcDE7CtWrOmTtWbSeInvNegTx/YuhVuuQVW\nrICRI6Ft27qtXx34+uuvee655xpUGKiI2rXEox6FBJCRkcG4ceMYis0Urk533R5sVnFW4Dx33nln\nJc8QOUwlJbaFdbPAkmEffGBhoWNHuOce6BRpC7P6a8WKFfTq1avWX7cuw0BVqF1LHAoKCSIrK4ub\nR4/meMdhouMwiNLLMpdViF0aeYfXy06vlyemTiU9Pb12KisN19dfw+23w7XXwqVhq/QvXAjTpsH+\n/bB4cZ1VrzYFd2NdvXo1V1xxRVxew+1hoDJq1xKDgkICycvLY9Tw4SzMzqaV18tAx6EbdslQU2w2\n8DrseuK5Xi/bHYf+ffsyfeZMdctJ7fnNb6BdO7j5ZkhJCZXPmwe33goDB8LEiXVXvxiKtDV78Hb4\nbqyHI9HDQGXUrrmfgkIC8vl8ZGZmsmjBAr4MbCAV5PF4OD0lhT5paYwcOVKXCkl8FBdD48alyxwH\nvF5Ytw6GDoUrroDRo0NDEPv2Wa/CU0/B668nzBBEVcNA+NbswQ/y4O1rr72WlStXRn2N+h4GqkLt\nmnspKCS4/Px8cnJyKCwsJCkpidTUVK1MJrXjwAGYNcsmLXboYGXByYyPPw7HHQd/+EPp56xYAePG\n2bDEmDG1X+coYhEGKtqa/fe//z1z585t8GGgqtSuuYuCgohU3wcfwPXXw5Yt8NBDcNNNkJwcuaeh\nrEGDLEQ8+aRNfKylD8h4h4GK5Ofn06xZM4UBSUgKCiJSPVu2wF//CiedZB/yM2bAW2/BRRG28Qm/\nXDIYIubPt6GJTZssXMRQXYYBkfpKQUFEqmbfPjjySNi+Hd55B846C84+G3r0gObN4fnn4cQTKz/P\n6tVw332QmVm148tQGBCpXQoKIlIxv98mIK5ZY5MRAQoLISmwcXlurq2R8MADtl5CZb0EO3fCnXfC\n3/4GxxwT5SX9+P1+lixZcigIKAyI1A0FBRGp3PTpsGgRXHklXHVVqDx4pcPDD8OECfD226EhiOCw\nQ/jwQ/D21q3Qpk3518F6DAB+/etfs3DhQoUBkTqmoCAi0QU/2HftgkmTYNUqePRRCF6eFh4CuneH\no46CF1+Egwdt3YRrr7VhiSpyHIeSkhIWLVqE3+9XGBBxAQUFEamaJUvg3Xdh1KjSvQHBXoW8PFsb\n4ZJLIDsbLr7YQsORR1Z6ar/fj0c7S4q4koKCiMRGQQF06WLDChMn2sqMIpLwtHukiFRP+HBD0IYN\ndvVDhw6wbBn8/OdWXpV1FUTE1dSjICKHb/t2u+wxLc3uKyCI1BsKCiL1TIXj/WU/wCP1Dhyu4JwF\nEakXFBREElDZRYeaN2/OwIEDadSoEd7KPqQPHIB774UhQ2zBJH37F5EKKPaLuFRVVyDs27cvCxcu\nBKh8L4GPPrLlkzdsgPXr4c03LSTEo2dBROoF9SiI1KFYLEd82mmnVe3Swh074MYboWVLW0lx1iy4\n5hoYOzZyUFB4EBEUFETirk72JvD7bZGkP/4RZs8OLXo0e7YtlpSSAhkZtijS7NlwzjnRhyAOHgQt\neCTSYCkoiMSAKzcqKimBnj1tf4YePco/vmIFjB9vO0DOm2dlZXsRHn4Y9u6F+++vte2gRcRdNEdB\npIpqEgYuuugi0tPT62Zvgq1b7cP94MHgL2D3g2GgZ08YPBgeecQ2aBo7tvxQw3ff2eqKEybUTp1F\nxHXUoyASxpU9A4cjLQ1atYLnnitdHgwLO3ZYr8H8+fDSS7ZQ0lNP2S6QTZrAN9/A9dfDlCm2PLOI\nNDgKCgkuPz+fnJwcCgsLSUpKIjU1lebV2ISnIap3YaAi774Lr78Of/mLzUsI9iqE++or+Oc/4dtv\n4ccfoUULG65ITrYg8d13cOaZdVN/aZDUrrmLgkIC8vl8ZGZmkj1/Phs2bSL8f6HH46Fjhw70HTCA\nESNG0KmBfgtsUGFApB5Qu+ZeCgoJJC8vj1HDh7MwO5tWXi8DHYfuQCegGbAf8AErgbleL9sdh/59\n+zJ95kzat29fl1WPC4UBkcSnds39FBQSRFZWFjePHk1Lx+FBx2EQUNHH20HgVeAOr5edXi+Tpkxh\n6NChtVPZGFIYEKm/Gmq7lmgUFBJARkYG48aNYyjwGHBUNZ67F7gVyAImTJjAXXfdFY8qHhaFAZGG\np763a/WJgoLLZWVlMWzYMB4AxlXjecOAp4BLgTeBB4B7AudLT0+PfUUroTAgIkE1bdcAHOAs4Eug\nH/AOddeuNRQKCi6Wl5fHmZ06cfWBA/yjGs9bBfwCOAK4GAsKfuBG4MXkZL7w+eIytqcw4EI7d9pl\njStXQrt2dV2bkKIiOO00mDsXzj23rmsjtaim7VrQY8C92NyFv2GBIZ7tmigouFpav36sf/99vnCc\nanXLXYBNBFoEnIkFBYA9wJleL51692bBu+/WqE4KAwnm1lth3z6YOTNUNmaMbQ61dq2FiE8/rf55\nx4+HzZvh6adDZdOm2eJN339vu1JOmQLdu4ce790bbrgBrrvO7k+fDq+9BosW1ex3k4RU03YNYDvQ\nEfgLcDfwCDCUw2/XpGJamdGlfD4fC7OzGQMcA3wIXFjmmJnASGAtFgwAZgHrgNexoBDuaGCi43BN\ndjbr16/njDPOiPjaCbcCoURWUGAf5NnZpcs9HkhPtyWcP/88Nq81Zw7cdhs8+aQtF/3443DJJbZG\nQ8uWkZ8zZIgFmfXrbf8JqffeeOMNFmZncxuhOQmfAt2Ac7He0KA04EdgeVjZX4EzgGuwoABVb9ek\n5hQUXCozM5NWXi/3Ow5PAy9TPii8DHQhFBLysTfSXUCrKOcdCNzi9TJ9+nRuv/12hYH67O23bdGk\n8G/1AJMm2c/t22MXFB5/HIYPD/UWZGba6z/9tC0NHUmLFnDBBbYi5PjxsamHuNrixYvxYEOhQUuB\nRsBnWBvWPPD4cmBE2HGfYF+E/g2U3dM02K7NmDGDyZMnx6n2DZeCgktlz5/PQMfhaOAy7JKgyYTe\nINuwXob7w54zHrvu+OYKzpsEDHQcnpw2jalTpwIKA/XWsmVw3nnxf52iIli9Gu68M1Tm8UCfPrB8\neemysnr0gKVL41/HOnb++efXdRVcYe2aNbTDPuyDlgK/Bf4VKO8H/AcbKv1l2HGjgauBHsDmMucN\ntmuLFiyIU80bNgUFF9q7dy8bNm0i+D1sMPAS8AHQO1D2Cpa6rwzc/woLEnOwSYwV6QZk+v288sor\nnHnmmQoD9dXmzdCmTXzOfe+9ods7dtgW1a1blz6mdWvYsCF0/733yp+nTRurZz338ccf13UVXCMN\nCwUFQFNgGTAR+BoLDf0I9TIEg8IzhIZUo+kGZObmkp+fr+WeY0xBwYVyc3Px+/2HhhT6Y+NwcwgF\nhZeBrkBq4P4Y7E11RRXO3xkLGUVFRezbt4+1a9fGrO5S+7p06RI56BUU2NCDmzVtCvv3R3zI7/ez\nZs2aWq6QxFs/rId0OXAS8AM2rLoWCwgEfnYCWmA9C3cCY4GKYm9n7G8mJyeHrl27xqfyDZSCggsV\nFhYCNowAtlLZFViang58B3wEPBR4/D3sWuLXCXXJ+bHrjQsCZccRmjzUNPBzyJAh8foVpBZt2bKF\ntm3bln+gZUvYvTv+FWjZEho3hm3bSpdv2wY/+1nFz921C044IeJDxcXFnFcbQydSq84FkoElQFts\nPlUqFhZmYKsvLgN+Fzj+EaAI6z0Ntm/fBH7uDpS1IdSuBdtPiR0FBRdKSkoC7DrhoMHYRJ7FWBcc\nhIYdvsHmLvy2zHk8wLdAB+Bx4KZAeUHg5wsvvEDHjh1jWXWpA63LdvkHnXMOzJ4d/woccYTNhVi8\nGC6/3Mr8frt/000VP3ftWqtnBI0bN2b16tUxrmzdUOAJKcLmGSwB2hGapH0hUAjMxuZg/SpQ/g0W\nCMpuA+UBMoAHgTWE2rVg+ymxo6DgQqmpqXg8Hnx+Pz0DZX2AY7G5CuuxN9rJgccuJvLY3TDgFGzl\nsy5h5euw3dguu+wyjeXVZ5dcYhMMf/oJjjkmVJ6bC3v32vbRBQXw2WdW3rkzeGvYJNx6K1x/vQWG\n4OWR+/dbWUWWLoWMjIgPeTwezq0nizH16tWrrqtQ54qLi1m5ciU+LBQ8BmwCbgs8fjxwOvAwFgKC\n8xPGUP5L0HZsAbkbsN7W9ti8LY/HQ2pqKhJjfnGl01NS/CPte9mhf8PAfxT4G4N/UpnHIv07BfyX\nRSgfCf4zUlPr+leU2tCrl9//5JOly/7nf/z+Ro3K/9u8OXSMx+P3P/dc9V5r2jS//+ST/f7kZHvd\nlSsrPv7f//b7jzvO7z9woHqvIwkr2K69A34P+BuBf01Y2zQiUN6hkrbt68Bxj6pdqxWN6jqoSGR9\nBwxgrtfLwbCywcA+LG3/bxXO4aH89caF2FatfdLSYlNRcbe774Ynnihd9v77dpVC2X/BJZ7z8mw4\n4YILqvdao0bB119bL8Xy5dCtW8XHP/GErbGgruIGI9iudQMaY5O0zw57/EKszbqoCucKb9vUrsWX\nlnB2KZ/PR+fOnZkNxHLK4QvYqmY+n08rmDUUkyfDwIFw4olVO376dFstccqU+NWpqAj+/ndbzVFB\nocFQu5aYFBRc7HDWRI8kFns9iIgcDrVriUdBwcUOd5e1cLWxe6SISGXUriUezVFwsfbt2zNpyhSy\ngAmHcR5/4PlZwBNTp+rNJCJ1Ru1a4ml833333VfXlZDozj33XI444gjufu89vsVWZqzOiO4ebI30\nR4GMjAzGjBkTj2qKiFSZ2rXEoqGHBJGVlcXNo0dzvOMw0XEYhK3YGE0hMBe4w+tlp9fLE1Onkp6e\nXjuVFRGpArVriUFBIYHk5eUxavhwFmZn08rrZaDj0A1b47wptjLZOmxP97leL9sdh/59+zJ95kx1\ny4mIK6ldcz8FhQTk8/nIzMxk0YIFfBnYQCrI4/FwekoKfdLSGDlypC4VEpGEoHbNvRQUElx+fj45\nOTkUFhaSlJREamqqlmUWkYSmds1dFBREREQkKl0eKSIiIlEpKIiIiEhUCgoiIiISlYKCiIiIRKWg\nICIiIlEpKIiIiEhUCgoiIiISlYKCiIiIRKWgICIiIlEpKIiIiEhUCgoiIiISlYKCiIiIRKWgICIi\nIlEpKIiIiEhUCgoiIiISlYKCiIiIROWt6wrI4cnPzycnJ4fCwkKSkpJITU2lefPmdV0tEZEaU7vm\nLgoKCcjn85GZmUn2/Pls2LQJv99/6DGPx0PHDh3oO2AAI0aMoFOnTnVYUxGRqlG75l4ef/j/DXG1\nvLw8Rg0fzsLsbFp5vQx0HLoDnYBmwH7AB6wE5nq9bHcc+vfty/SZM2nfvn1dVl1EJCK1a+6noJAg\nsrKyuHn0aFo6Dg86DoOAJhUcfxB4FbjD62Wn18ukKVMYOnRo7VRWRKQK1K4lBk1mTAAZGRkMGzaM\nqw8c4AvHYQgVv5kIPD4EWOs4XH3gAMOGDSMjIyP+lRURqQK1a4lDPQoul5WVxbBhw3gAGFfBcc8B\nN0Qo9wDfATOBewLnS09Pj31FRUSqqKrtWtANWBtXVkvgB9SuxZuCgovl5eVxZqdOXH3gAP+o5Njn\ngD8CDwCnlHlsEHAEcCPwYnIyX/h8GttrKHbuhE6dYOVKaNeurmsTUlQEp50Gc+fCuefWdW2kFlWn\nXQu6AZgDPAWEf2AdDfwLtWvxpqEHFxs1fDgtHYfHqvGc/ljXXPi/JljPwqPA8Y7DqOHDY15XcamM\nDLjiitIhYcwY6NYNkpNr/iE9fjzcENaHtXQpXH45nHgiNGoEb75Z/jm9e8OsWXb7iCPg//4Pxo6t\n2etLwqpJuwZ2id7VlG7bLkXtWm1QUHApn8/HwuxsrnAcjgGWRjhmJvY/0FemPB8oiXD80cBEx2Fh\ndjbr16+PbYXFfQoK4OmnoexkL48H0tPhqqsO7/weT+j2vn3QtStMn166vCJDhsCyZaC/xQbjjTfe\nYGF2NoMch6MCZZ9i7Vi3MsemAeeXKSsB9pYpU7sWfwoKLpWZmUkrr5f7gebAyxGOeRk4E7uMCKxL\n7n+wN04z4DdATpnnDARaeb3MmDEjHtUWN3n7bes16N69dPmkSTByJMSym7Z/f7j/fvjNb6Cqo5kt\nWsAFF8BLL8WuHuJqixcvxkPp4YOl2AfRZ9iXHAKPLwd+FXbcfqxtOwY4HvgzsC/wmNq1+NKCSy6V\nPX8+Ax2Ho4HLsEuCJmNDCADbgA+B+wP3m2HjeL2xN9NqrEvuAiyxnxg4LgkY6DgsWrCgNn4NqUvL\nlsF559V1LUIi9TT06GHDFvXc+eeX/W7cMK1ds4Z2wL/DypYCv8XmGvwb6Af8B9gDXBg4pg0wFjgX\n61VYCEwHPgc+QO1avCkouNDevXvZsGkTwdHbwcBL2Buid6DsFSx1Xxm4/7+Bf0GXY2+4i4AM7E0V\n1A3IzM0lPz9fy6LWZ5s3Q5s28Tn3vfdW/znvvVe+rE0bq2c99/HHH9d1FVwjDQsFBUBTYBkwEfga\nCw39CPUyXBB4TtkLIK8ETsWumHg1cF/tWvwoKLhQbm4ufr//0JBCf6yXYA6hoPAy0BVIreA8FwA9\ngUVlyjsDfr+ft956i44dO8au4lInunTpQpMmEa5ALyiwoYdoRo+G7dvjV7GqaNoU9u+P+JDf72fN\nmjW1XCGJt37Yh/ty4CTs8sYLgbWE5mItw4ZUW1RwnluAu7H27UpC7VpOTg5du3aNT+UbKAUFFyos\nLARsOAHsqoUrgNexnoHvgI+Ah6pwrrbAV2XKmgZ+Dhky5HCrKi6wZcsW2rZtW/6Bli1h9+7oT2zR\nAqZNi1/FqmLXLjjhhIgPFRcXc56bhk4kJs4FkoElWPvUCvvCcyEwA1t9cSnwu0rOk4zNVdgVuB9s\n14Ltp8SOgoILJSUlATZ5J2gwMAtYDKwLlF1J5TYBZZvhgsDPNm3akJqaStu2bWnbti3t2rWjXbt2\ntGrVisaNG9f8F5Ba1bp168gPnHMOzJ4d/YmNXDCXee1aq2cEjRs3ZvXq1bVcofhQ4AkpAnpgQaEd\noXkIFwKFwGxsDtZFlZwnH9hBqH0LtmvB9lNiR0HBhVJTU/F4PPj8fnoGyvoAx2JzFdZjb7STw56z\nA1ulLNx8bFLjzWXK12GTIi+//HK2bNnCJ598wpw5c3AcB4AmTZqQkpJCamoqp5566qGfp556Kied\ndJJCRKK45BLIKXvdSxR+f9Uva4xk3z57reAVD5s2wWefwXHHQaTejqClS22thwg8Hg/n1pPFmHr1\n6lXXVahzxcXFrFy5Eh8WCh7DvsjcFnj8eOB04GGsfQoGiEIsXJSddRCcyJ0W+LkO+5tJTa1oQFZq\nQiszutQZqan0zs0tNQnxRiwo7MeuaBgT9thpwDnYhJ5jsIDwDHa1wyeU7lUYBXyQmopv48ZDZY7j\nsHnzZnJycti4cSMbN248dDsvL08hIlEF5ylUNwSkpcHVV8N111Xt+A8/tAWVyr7OH/5gazlEsnw5\nXHopbN0K+hbYIATbtSuwuVcerK0KzigYia0P0x7IDZRtxtq2q7EgAXbVwwJgADAvUBapXZPYUFBw\nqZtuuok5M2bwjeMc2ihlMTYRqBH25gmfz34P8DaQhwWJn2Orlt1D6ZBQCLTzehk8ciSTJ0+uUl0U\nIhJYSUn1hxiCvQt79sDRR8enXmALPp1zDtx+e/xeQ1wl2K6tdxxaY70Euwhd9v0CcC1wHfZFB+An\n4CbgY2ArUIzNafg91hvRmJq1a1J1Cgou5fP56Ny5M7OxpUpj5QXgmsD5zzjjjMM+n0KE1EhREfz9\n73DbbepNaEASpV2T0hQUXCytXz/Wv/8+X4Qtd3o49gBner106t2bBe++G4MzVkwhwoWCvQX//S+s\nXg2PPw7/+hccc0xd10waiERv1xoiBQUXq8kua9H4cdfukQoRdcTvh2++sY2iTj/d9mfQxkxSi+pz\nu1ZfKSi4XHX3bY/ED0zA5iskwr7twRARHh4UImLkxRfhkUfsSoR//CPyGgY1mdcgUg0NsV1LZAoK\nCSAjI4Nx48YxFLukqDrddXuwCT9ZgfPceeed8ahirVGIOAyvvw5TpsDPfx5aXyEYCr78Ej7+2HZ0\njLTKo0iMqV1LHAoKCSIrK4ubR4/meMdhouMwCKioOS8E5gJ3eL3s9Hp5YurUep+4FSIq8N//wg03\n2LoG48fbsENxMQR/13HjYMkS+OEHeOgh2wVSJM7UriUGBYUEkpeXx6jhw1mYnU0rr5eBjkM3bI3z\nptjKZOuAVcBcr5ftjkP/vn2ZPnNmgx+7a/Ah4pFH4M034dZbbX5CWQcOWFC4/Xabw/D55/HbUEok\njNo191NQSEA+n4/MzEwWLVjAl4ENpII8Hg+np6TQJy2NkSNH6lKhKqj3IWL/fhgxwnoQ/vlPu+oh\nePVD+IqMzz9vV0EMGQJ/+cvhr9YoUg1q19xLQSHB5efnk5OTQ2FhIUlJSaSmpmqL1RiqFyFi+3bo\n0AFeew369Ys8WXHFChuSaNQI5gXWulNQkDqids1dFBREaihhQsSsWfDMM/D++6XLg0Fg506bl/D2\n2zbJ8ZxzSs9fEJEGTZtCidSQ1+slJSWFlJSUco9FCxFvvfVW7YeII48Er9eGIJo2DfUSBH/OmwcL\nF8L111tI8PsVEkTkEPUoiNSyWu+JmD3bhh9uucXu+/02cfFXv4JVq+Deey00aMhBRCJQUBBxkZqE\niICOR8EAAAreSURBVDvuuIOePXvSKNoiSfv22VUNxx9v8xM+/9zmKpxzDpxyiu3i+Nxzdt9xrPdB\nRCRAQUEkQUQLEZs3b+bpp5/mvPPOq3ovw5YtcM018NFH8Nvfwty5Na/Yf/8LJ51U8+eLiKspKIjU\nA47jkJ+fT4sWLSgpKYneuwClJyrOnAl/+hP07QsvvVT9zaE++ggeewwGD4Yrr6z5LyAirqUF3UXq\nAa/XS4sWLQAqDglgIaG42G4PHw4bN9rmUM2aWVnwu0PwmLKCj+/YAdnZcMQR0KlT+eNKSqr5W4iI\nGykoiDREwR4Fx4H27WHiRPvAB9vzIfyYsoITHd94A5Ytg0svhS5dLECUlNhQRFFRaK0GdVqKJDQF\nBZGGzOsNffMvKLC1Fi64AKZNq7xHoG9fSEuD3//e7s+aBf37w2WXwRlnwJw5Vq4rKEQSmuYoiIh5\n4w3bXbJ7d/jrXyEwlFElU6fChAnQpw8MGgTffgv33GNbWf/ud/Grs4jEnYKCiISsX2+9AVURnBT5\n6afQqxfcfTeMGQNHH22PDx4MrVpZ+AgXaQlpODQJc+/evTRr1sy9e2eINDAKCiJSXnUWXerZ07av\nfvllOOqoUPmAAbYq5CuvhMqqsE6D4zjk5uZy3XXX0bp1a/ftnSHSwGhlFREpr7KQEAwSs2fD2rU2\ntyE8JPznP7BrF/zyl6Geh4kTrXzqVDjhhKin9nq9nHrqqTz11FOMHTu2bpa9FpFDFBREpPo8HhtC\nWLYMLr+89HDFwYPw1lv2s1s3Cwmffw6LFsGvfw1Nmthx06ZZ4Pjzn8udvlGjRnTp0oX58+cDkReb\n2rhxo0KESC1QUBCRmmnUyDaa+uGH0r0Jb7xhO1H+4he2VDTAX/4CKSlwxRWhRZ1+/BEKC6v0UtXd\ngEshQiR2FBREpOZ69rQVHXfsgJYt4d13YfJk21fivvtCx11zDfz859ChQ6js88/tuMOkECESX5rM\nKCI1t3u3DT3k5MDpp8OHH8INN8DIkTbsEL5cdPgEya++skspX3jB5jHUwY6V0UJETk5OzEPEM888\nQ25ubqlztGrVCo/WmJAEoKAgIjUT/uE+e7bNSTjhBFupsTLTpsFrr8Gjj9ry0S5TVFTEli1bSoWH\nwwkR/fv355133in1GkcddVSp54Q/94QTTmjQISI/P5+cnBwKCwtJSkoiNTWV5s2b13W1GiwFBRGp\nufAeg6rauBHGjrXnvfpqfOoVRzUJEUuWLOGnn36q8ms0xBDh8/nIzMwke/58NmzaRPhHk8fjoWOH\nDvQdMIARI0bQKdLeIhI3CgoiEn/BRZb27LHVGh96yCY89uhR1zWLqUghYsOGDeV6Ew7H0UcfTWpq\naqnwELydiCEiLy+PUcOHszA7m1ZeLwMdh+5AJ6AZsB/wASuBuV4v2x2H/n37Mn3mTNq3b1+XVW8w\nFBREJL7ChyimTbOtrS+/3JZ8bgC++uorOnbsWCuvlWghIisri5tHj6al4/Cg4zAIaFLB8QeBV4E7\nvF52er1MmjKFoUOH1k5lGzAFBRGpHRMmwLx5dqXEE0/UdW1qzZIlSxgwYAD79u2r03oEQ0SkIY26\nCBEZGRmMGzeOocBjwFGVPSHMXuBWIAuYMGECd911VzyqKAEKCiISX0uXwr/+ZT0JmZm2w2QMLotM\nJH6/n++//77cnIbgz4YWIrKyshg2bBgPAOMO4zwPAPcEzpeenh6bykk5CgoiEj8//gi33w5t2sDF\nF9ulkFJKQwsReXl5nNmpE1cfOMA/qvE8P5AJPAlswOYvnA20AN5JTuYLn09zFuJEQUFE4uv77+Fn\nP6vrWiSk+hgi0vr1Y/377/OF41RruOF64EXgOuB8YB+wBrgCGO310ql3bxa8++7h/1JSjoKCiMRX\nHSym1BBEChHB224NEY0bN+baa69lNjCkGud6GbgKeAO4PMLjLwDXYJdYnlHVbdKlyhQURETqGbeH\niNeA3wZufwp0A84FVoUdkwb8CCwHevH/27u/V73rAoDj71NPLWlJMVh1KGnuQJOKgiS8yN20hRO6\nSWN/gIfcUYygK8mgoGV1UTqHKY3uoisvimCBBZJFWII3NcIpEiIyM4IxHIceWhffZzhlH80f58w6\nr9fN2XnO832e7/dqbz6fz/fzraXFv89VZ5umHs5br66YzTq4ttaRI0c29uS3IKEAsIVcGBEvn8rY\n6IiYVW+vvlJ9f/Ha3dXXmkLgn9X2phh4X3Wo+nrTOoRbm+6MuKc6U+2qvlt9afE5t1QPrax04uTJ\nDTv/rUooAFC9ckScPHmyF1544Q1/xyery5pGB6pubIqEn1e/rD7ftPbg09Uvqg81jTbsqN5RfbO6\nvCkw/lgdXxzzk2p1aanTp0/b7vlNJhQAeFXnzp3r2WefveiiytcSEbdWP26aVris+kB1Z3VvdV3T\nLY9HmvZJeL76c7W3KSYeaZqmqGkx465qT/Xbxd+uqR577LE+9RZ8fsj/Mo+ZBuBVLS0ttby83PLy\ncnv37n3J315LRFzTFAV/aBot+Ht1bVMQPLx4z8NNWzi/tykmaoqCq3vRu6svVD+t/n3B+9bX19+0\na2YiFAB4Q/6biDh+/Hirq6vtqt7VNArw4WpntdIUCz9q2qb5d9UXF8cvL36+/yLfu7P6V9PowtnF\na9u2bXvzLoyq3napTwCA/1/nI+LgwYMtLS31ePWZplB4uCkQWvxcbxohONU03VD1wabpiWcu8tnP\nNEXHe6q/LL5rZWVlw65lqxIKAGy47du399Err+xPTVHwSPVQL4bCjqb1Bt9rWo9w7QXHHqyern5z\nwWvPNy12/Nzi90erPbt3W8i4AYQCAJti//XX98Bs1jVNUwVP99Ig2Fs9Xn2kF6ccqm5vGlW4ofpW\n9cPqs9W8+k7TSMQDs1n7DhzY6EvYkoQCAJvi0KFDPTefd6ppP4XLm26XPO/aptGEvS87bmf1+2pf\ndVf1jeqKpumLj1cPVM/N562trW3sBWxRbo8EYNO83mc9jJyuPuFZDxtKKACwaV7v0yMv5lz15epn\nnh65oUw9ALBpdu3a1V333NOx6ttv4HPOLY4/Vt199KhI2ED2UQBgU62urnbq1KnuuOOO/lb9oF7T\nNMTppudDHKsOHz7cTTfdtBGnyYKpBwAuiWPHjvXV225rx3zenfN5N1bvfIX3rzctXLx9Nusfs1l3\nHz0qEjaBUADgknnqqae65eab+9WDD7ZzNuuG+byrq481bct8tmkzpUebboF8bj7vuv37u/f++003\nbBKhAMAld+LEie67775+ffx4f33yyS78r2lpaak9u3e378CB1tbWuuqqqy7hmW49QgGAt5QzZ870\nxBNPtL6+3rZt21pZWbHj4iUkFACAIbdHAgBDQgEAGBIKAMCQUAAAhoQCADAkFACAIaEAAAwJBQBg\nSCgAAENCAQAYEgoAwJBQAACGhAIAMCQUAIAhoQAADAkFAGBIKAAAQ0IBABgSCgDAkFAAAIaEAgAw\nJBQAgCGhAAAMCQUAYEgoAABDQgEAGBIKAMCQUAAAhoQCADAkFACAIaEAAAwJBQBgSCgAAENCAQAY\nEgoAwJBQAACGhAIAMCQUAIAhoQAADAkFAGBIKAAAQ0IBABgSCgDAkFAAAIaEAgAwJBQAgCGhAAAM\nCQUAYEgoAABDQgEAGBIKAMCQUAAAhoQCADAkFACAIaEAAAwJBQBgSCgAAENCAQAYEgoAwNB/APn9\nZzTbKZXAAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10c624f28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 描画\n",
    "\n",
    "pos={'v1':(0,10),'v2':(0,8),'v3':(0,6),'v4':(0,4),'v5':(0,2),'w1':(2,10),'w2':(2,8),'w3':(2,6),'w4':(2,4),'w5':(2,2),'w6':(2,0)}\n",
    "edge_labels = {(i, j): (w['capacity'], str((w['flow'])) ) for i, j, w in H.edges(data=True)}\n",
    "nx.draw_networkx_edge_labels(H, pos, edge_labels=edge_labels, font_color='r')\n",
    "nx.draw_networkx_labels(H, pos)\n",
    "nx.draw(H, pos)\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ford-Fulkersonでも求めてみる"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "code_folding": [
     6,
     98,
     118
    ],
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#ch02で作ったやつ\n",
    "import networkx as nx\n",
    "import matplotlib.pyplot as plt\n",
    "from collections import deque\n",
    "import numpy as np\n",
    "\n",
    "def bfsFlowPath(G, s, e):\n",
    "    '''\n",
    "    Search a path from s to t all of whose points have strictly positive capacity.\n",
    "    \n",
    "    Inputs:\n",
    "        G: a graph\n",
    "        s: a start point\n",
    "        e: an end point\n",
    "        each edge has two attributes:\n",
    "            capacity: capacity\n",
    "            flow: its current flow which should be no more than its capacity\n",
    "    Output:\n",
    "        path: a list of edges which represents a path from s to e.\n",
    "        At each edge of the path, its current flow is strictly less than its capacity.\n",
    "        In case there is no path from s to t, return None.\n",
    "    '''\n",
    "\n",
    "    # 過去に訪れた点を記録\n",
    "    # sは最初から入れておく\n",
    "    past = [s]\n",
    "    # pathを記録するためのリスト\n",
    "    path = []\n",
    "\n",
    "    # 全ての点のsからの距離の初期値を無限大に\n",
    "    for p in G.nodes():\n",
    "        G.node[p]['dist'] = float('inf')\n",
    "    \n",
    "    # node s の距離を0に\n",
    "    G.node[s]['dist'] = 0\n",
    "    \n",
    "    # sに隣接する点をqueueに\n",
    "    # queueには、今後訪れるべき点が格納される\n",
    "    queue = deque()\n",
    "    for p in G.successors(s):\n",
    "        # current flow < capacity となるedgeだけをpathの候補に\n",
    "        # flow < capacity となるedge以外は存在しないものとして扱うのと同じ\n",
    "        if G[s][p]['flow'] < G[s][p]['capacity']:\n",
    "            queue.append(p)\n",
    "            \n",
    "    # あとで条件分岐に用いる\n",
    "    numberOfSuccessorsOfSource = len(queue)\n",
    "    \n",
    "    # sに隣接する点の距離を1に\n",
    "    for p in queue:\n",
    "        G.node[p]['dist'] = 1\n",
    "\n",
    "    # BFSを用いてflow < capacityを満たすsからeへのpathがあるのか調べる\n",
    "    # pastに過去に訪れた点を格納\n",
    "    while len(queue)>0:\n",
    "        v = queue.popleft()\n",
    "        if v == e: break\n",
    "        else:\n",
    "            past.append(v)\n",
    "            for p in G.successors(v):\n",
    "                # (過去に訪れていない and flow < capacity)を満たすedge\n",
    "                if ( (not p in past) and ( G[v][p]['flow'] < G[v][p]['capacity']) ):\n",
    "                    if ( not p in queue):\n",
    "                        queue.append(p)\n",
    "                    if G.node[p]['dist'] > G.node[v]['dist'] + 1:\n",
    "                        G.node[p]['dist'] = G.node[v]['dist'] + 1\n",
    "\n",
    "    # sからeへのpathが存在しない場合はNoneを返す\n",
    "    if numberOfSuccessorsOfSource == 0:\n",
    "        v = s\n",
    "    if v != e or v == s:\n",
    "        # print ('There is no path.')\n",
    "        return None\n",
    "    \n",
    "    # 以下、sからeへのpathが存在する場合\n",
    "    # 終点から遡ってpathを形成する\n",
    "    pp = e\n",
    "    while (1):\n",
    "        if pp == s: break\n",
    "            \n",
    "        pred = G.predecessors(pp)\n",
    "        count = 0\n",
    "\n",
    "        for p in pred:\n",
    "            # ここに、flow < capacity の条件を追加\n",
    "            if ( G.node[p]['dist'] == G.node[pp]['dist']-1 and G[p][pp]['flow'] < G[p][pp]['capacity']):\n",
    "                path.insert(0, (p,pp))\n",
    "                pp = p\n",
    "                break\n",
    "            else:\n",
    "                count += 1\n",
    "        \n",
    "        # 条件を満たすedgeがない\n",
    "        if count == len(pred):\n",
    "            break\n",
    "\n",
    "    return path\n",
    "\n",
    "def makeResidualGraph(G):\n",
    "    '''\n",
    "    Input: a graph G\n",
    "    Output: its residual graph Gf\n",
    "    '''\n",
    "    Gf = G.copy()\n",
    "    edgeList = G.edges()\n",
    "    \n",
    "    for edge in edgeList:\n",
    "        # Initialize flow\n",
    "        Gf[edge[0]][edge[1]]['flow'] = 0\n",
    "        \n",
    "        # 逆向きのedgeがないものは追加\n",
    "        if not (edge[1], edge[0]) in edgeList:\n",
    "            Gf.add_edge(edge[1],edge[0])\n",
    "            Gf[edge[1]][edge[0]]['capacity'] = Gf[edge[0]][edge[1]]['flow']\n",
    "            Gf[edge[1]][edge[0]]['flow'] = 0\n",
    "    \n",
    "    return Gf\n",
    "\n",
    "def fordFulkerson(G, s, t):\n",
    "    '''\n",
    "    Inputs:\n",
    "        G: a graph\n",
    "        s: a source vertex\n",
    "        t: a sink vertex\n",
    "    Outputs:\n",
    "        the graph G whose flow was modified by Ford-Fulkerson algorithm\n",
    "        In case there is no path from s to t, return None.\n",
    "    '''\n",
    "\n",
    "    # initialize flows\n",
    "    for e in G.edges():\n",
    "        G[e[0]][e[1]]['flow'] = 0\n",
    "\n",
    "    # Forward edgesを記録\n",
    "    forwardEdges = G.edges()\n",
    "    \n",
    "    # Residual Graphの作成\n",
    "    Gf = makeResidualGraph(G)\n",
    "    \n",
    "    # そもそもGにおいてsからtへのパスがあるのか確認\n",
    "    path = bfsFlowPath(G, s, t)\n",
    "    if path == None:\n",
    "        print (\"There is no path from \" + str(s) + \" to \"+ str(t) )\n",
    "        return None\n",
    "    \n",
    "    # Gにおいてsからtへのパスがある場合\n",
    "    while(1):\n",
    "        # これ以上パスがみつからない場合は最適なのでそこでループを打ち切る\n",
    "        path = bfsFlowPath(Gf, s, t)\n",
    "        if path == None:\n",
    "            break\n",
    "\n",
    "        # まだパスがある(最適でない)場合\n",
    "        else:\n",
    "            # path上のedgeについて、capacity - flowの最小値を調べる\n",
    "            diff = float('inf')\n",
    "            for edge in path:\n",
    "                diff = np.min([diff, Gf[edge[0]][edge[1]]['capacity'] - Gf[edge[0]][edge[1]]['flow'] ])\n",
    "            \n",
    "            # path上のedgeのflowを更新\n",
    "            for edge in path:\n",
    "                if edge in forwardEdges:\n",
    "                    Gf[edge[0]][edge[1]]['flow'] += diff\n",
    "                    # このとき、backward edgeのcapacityを更新する必要あり?\n",
    "                    Gf[edge[1]][edge[0]]['capacity'] += diff\n",
    "                else:\n",
    "                    Gf[edge[0]][edge[1]]['flow'] -= diff\n",
    "                    Gf[edge[1]][edge[0]]['capacity'] -= diff\n",
    "    \n",
    "    # もともと無かったedgeを消去\n",
    "    for edge in Gf.edges():\n",
    "        if not edge in forwardEdges:\n",
    "            Gf.remove_edge(edge[0],edge[1])\n",
    "    \n",
    "    return Gf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "code_folding": [
     0
    ],
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def biMatch_ff(G,V,W):\n",
    "    '''Calculate the perfect matching of (G,V,W) by using Ford-Fulkerson algorithm.\n",
    "    \n",
    "    Parameters\n",
    "    ----------\n",
    "    G : bipartite graph\n",
    "    V,W : the lists of nodes, two groups of G\n",
    "    \n",
    "    Return\n",
    "    ------\n",
    "    G : modified graph with perfect matching \n",
    "    '''\n",
    "    \n",
    "    H = add_st(G,V,W)\n",
    "    I = fordFulkerson(H, 's', 't')\n",
    "    I.remove_node('s')\n",
    "    I.remove_node('t')\n",
    "    \n",
    "    return I"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "H = biMatch_ff(G,V,W)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n"
     ]
    }
   ],
   "source": [
    "print(H['v3']['w2']['flow'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "code_folding": [
     0
    ],
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10f67e9e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 描画\n",
    "\n",
    "pos={'v1':(0,10),'v2':(0,8),'v3':(0,6),'v4':(0,4),'v5':(0,2),'w1':(2,10),'w2':(2,8),'w3':(2,6),'w4':(2,4),'w5':(2,2),'w6':(2,0)}\n",
    "edge_labels = {(i, j): (w['capacity'], str((w['flow'])) ) for i, j, w in H.edges(data=True)}\n",
    "nx.draw_networkx_edge_labels(H, pos, edge_labels=edge_labels, font_color='r')\n",
    "nx.draw_networkx_labels(H, pos)\n",
    "nx.draw(H, pos)\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "うまく動いている"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "maximum flow: 4\n",
      "(s, v1): 0/1\n",
      "(s, v2): 1/1\n",
      "(s, v3): 1/1\n",
      "(s, v4): 1/1\n",
      "(s, v5): 1/1\n",
      "(v3, w2): 1/1\n",
      "(v1, w1): 0/1\n",
      "(v1, w2): 0/1\n",
      "(v4, w3): 1/1\n",
      "(v4, w4): 0/1\n",
      "(w3, t): 1/1\n",
      "(w4, t): 0/1\n",
      "(v2, w1): 1/1\n",
      "(v2, w2): 0/1\n",
      "(w2, t): 1/1\n",
      "(w1, t): 1/1\n",
      "(v5, w5): 0/1\n",
      "(v5, w6): 1/1\n",
      "(w5, t): 0/1\n",
      "(w6, t): 1/1\n"
     ]
    }
   ],
   "source": [
    "# NetworkXのライブラリを用いて求めるとこうなる\n",
    "flow_value, flows = nx.maximum_flow(G0,'s','t')\n",
    "print('maximum flow: {}'.format(flow_value))\n",
    "\n",
    "caps = nx.get_edge_attributes(G0, 'capacity')\n",
    "for u in nx.topological_sort(G0):\n",
    "    for v, flow in sorted(flows[u].items()):\n",
    "        print('({}, {}): {}/{}'.format(u, v, flow, caps[(u, v)]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda root]",
   "language": "python",
   "name": "conda-root-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  },
  "toc": {
   "nav_menu": {
    "height": "84px",
    "width": "252px"
   },
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 4,
   "toc_cell": false,
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}