{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", " <p><div class=\"lev1 toc-item\"><a href=\"#The-Push-relabel-Algorithm\" data-toc-modified-id=\"The-Push-relabel-Algorithm-1\"><span class=\"toc-item-num\">1 </span>The Push-relabel Algorithm</a></div><div class=\"lev2 toc-item\"><a href=\"#Initialization\" data-toc-modified-id=\"Initialization-11\"><span class=\"toc-item-num\">1.1 </span>Initialization</a></div><div class=\"lev2 toc-item\"><a href=\"#Push\" data-toc-modified-id=\"Push-12\"><span class=\"toc-item-num\">1.2 </span>Push</a></div><div class=\"lev2 toc-item\"><a href=\"#Main-Loop\" data-toc-modified-id=\"Main-Loop-13\"><span class=\"toc-item-num\">1.3 </span>Main Loop</a></div><div class=\"lev1 toc-item\"><a href=\"#Questions\" data-toc-modified-id=\"Questions-2\"><span class=\"toc-item-num\">2 </span>Questions</a></div><div class=\"lev1 toc-item\"><a href=\"#Summary\" data-toc-modified-id=\"Summary-3\"><span class=\"toc-item-num\">3 </span>Summary</a></div>" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# The Push-relabel Algorithm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Push-relabel algorithmを実装してみる。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "code_folding": [ 0 ], "collapsed": true }, "outputs": [], "source": [ "# 前回作った\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" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Initialization" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "code_folding": [ 0 ], "collapsed": true }, "outputs": [], "source": [ "def Initialize(G, s, t):\n", " '''\n", " Inputs:\n", " G: a residual graph\n", " V: vertices\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']" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "code_folding": [ 0 ], "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAFkCAYAAAC9wjgoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X18zfX/x/HH2Q7mOtcqiVmbWa5CSJSLFC19i3yVKMpV\nIkQ3iUq2r8IqrEzkS8hXvvrmJ0R8+UbIdS42m7GURCIXE7M5n98fb8eMXeFsZ9vneb/ddrN9Pp/z\nOa/V2ec8z/vzvnBYlmUhIiIituXj7QJERETEuxQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZE\nRERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGREREbE5h\nQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTm\nFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGRERE\nbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBE\nRMTmFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQG\nREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERszuntAkQkf0hMTCQ+Pp6kpCSKFClCQEAAJUqU\n8HZZIuIBCgMikqHo6GiioqL4dulSYg8cwLKsy/scDgdB/v481L49ffv2pVatWl6sVERuhsO68q9b\nRARISEjgpT59+Obbb6nodNIxJYVGQC2gGPAXEA1sBhY6nfyeksIjDz3Ex1OnUr16dW+WLiI3QGFA\nRNKYPn06gwYMoHxKCv9ISaETUDiT4y8A/wZedzo57nTy4eTJvPjii7lTrIh4hDoQishl4eHh9OrV\ni6fPn2dXSgrPkHkQ4NL+Z4DdKSk8ff48vXr1Ijw8POeLFRGPUcuAiACmRaBXr16MAUbexHnGAG9e\nOt8LL7zgmeJEJEcpDIgICQkJ1K5Vi6fPn2faTZ7LAnoD8/z82BUdrT4EIvmAwoCI0K5tW2JWr2ZX\nSgolPXC+00Btp5NaLVuybMUKD5xRRHKSwoCIzUVHRxMSEsJczL1/T/kc6Hrp/MHBwR48s4h4mjoQ\nithcVFQUFZ1OOqWzbyHmIrE2nX1TL+2LzuC8HYGKTidTpkzxTKEikmMUBkRs7tulS+mYkpLuqIFH\ngRLAF+ns+wK4GzP3QHqKAB1TUli5bJlnChWRHKMwIGJjZ86cIfbAARplsN8PeAwzj8CV9xOPAv8D\numRx/obA3v37SUxMvOlaRSTnKAyI2Nj+/fuxLCvDT/cAfwd+B9ZcsW0BJhx0zuL8IYBlWcTHx99U\nnSKSsxQGRGwsKSkJMFMMZ+QRoBQw/4ptXwD1gIAszl/0qucRkbxJYUDExooUKQKYtQYyUhj4G/Af\nwAX8CnxP1rcIAM5d9TwikjcpDIjYWEBAAA6HI8MRAW5/B/4AVmFuEUDWtwgA9mBWNwwIyKoNQUS8\nSWFAxMZSUlIoV6oUm7M4rg1QBvgX5hbBvcCd2Tj/FqBmjRqUKFHi5goVkRylMCBiQy6XixkzZhAY\nGMgfp04xH7P6YEacwJOYVoFNZO8WQRJmeeM27drdfMEikqMUBkRsZvPmzTRt2pQXXniBY8eOAXAC\nM3wwM38HzgIO4KlsPM9C4PeUFPr163cz5YpILtB0xCI2cezYMUaMGMGnn37K1X/2PsCtQAx4bG2C\nYMD3ttvYvG0blSpV8sBZRSSnqGVApIBLSUkhMjKSwMBApk+ffk0QADNK4DdgsAeezwKGACcKFeL0\n2bMEBgYyceJEUlJSPHB2EckJCgMiBdjatWtp0KABAwYM4OTJk5keG1K7Np8CYTfxfNalx38KRE6Z\nwv79++natSuDBw+mfv36rFmz5ibOLiI5RWFApAA6fPgwXbt2pUWLFuzcuTPTY/39/Vm8eDE7d+4k\nLCyMUUAv4Mx1PudpoDfwJhAeHs4LL7xAuXLl+Pjjj9myZQulSpWiZcuWdOnShUOHDt3Q7yUiOcQS\nkQIjKSnJGjdunFWiRAkL80E9w6+iRYtaY8aMsc6dO5fmHNOmTbOK+/lZVZ1Oay5YSWBZmXydB2su\nWFWdTqu4n581ffr0dGtzuVzWZ599ZlWqVMkqVqyYNXbsWOv8+fO58Z9FRLKgDoQiBcSKFSsYOHAg\nsbGxWR7bqVMnIiIiqFq1arr7ExISeKlPH7759lsqOp10TEmhIWatgaKYmQX3YOYRWOh08ntKCo88\n9BAfT51K9erVM33u06dPM3r0aCZNmkT16tWZOHEi7TT8UMSrFAZE8rmffvqJIUOG8J///CfLY4OD\ng5k8eTKtW7fO1rmjo6OJiopi5bJl7L20qJGbw+GgZo0atGnXjn79+hEcHHxddUdHRzNw4EBWrVpF\nhw4d+OCDD/D397+uc4iIZygMiORT586dY9y4cbz77rucP38+02NLlizJ22+/zYABAyhUqNANPV9i\nYiKLFy/mmWee4fPPP+exxx676ZkFLcti4cKFDBkyhN9//53XXnuN4cOHU6xYZksniYinqQOhSD5j\nWRaLFi2iVq1avP3221kGge7duxMbG8uQIUNuOAgAlChRgqCgIACCgoI8MsWww+GgU6dOxMTEMGzY\nMN577z2Cg4P58ssv0x0CKSI5Q2FAJB+JjY2lXbt2/O1vf+Onn37K9Nh69eqxbt06Zs2axa233po7\nBd6g4sWLM2bMGPbs2UOdOnXo2LEjbdu2JSYmxtulidiCwoBIPpCYmMjw4cOpXbs2y5cvz/TYMmXK\nXB7O16xZs1yq0DMCAgJYvHgxX3/9NQkJCdSpU4dhw4Zx+vRpb5cmUqApDIjkYZZlMW/ePIKCgnjv\nvfdITk7O8FiHw0GfPn2Ii4ujX79++Pr65mKlnvXoo4+ye/duRo8ezccff0xQUBBz5szRrQORHKIw\nIJJH7dy5kwcffJBnnnmGw4cPZ3pskyZN2Lx5M1FRUZQvXz6XKsxZfn5+jBgxgr1799KiRQu6detG\nixYt2LFjh7dLEylwFAZE8piTJ08ycOBA6tevz3fffZfpsRUrVmTmzJl8//33NGjQIJcqzF133HEH\n8+fPZ9WqVZw4cYIGDRrQv39/Tpw44e3SRAoMhQGRPMLlcjFjxgwCAwOZPHkyLpcrw2N9fX0ZPHgw\ncXFxPPfcc/j4FPw/5VatWrFjxw4iIiKYM2cOgYGBTJs2jYsXL3q7NJF8r+BfQUTygc2bN9O0aVNe\neOEFjh07lumxLVu25Mcff+T999+ndOnSuVRh3lCoUCEGDRpEbGwsoaGh9O7dm8aNG7Nx40ZvlyaS\nrykMiHjRsWPH6NWrF40bN2bTpk2ZHlulSpXLzeUhISG5VGHeVLlyZWbOnMn69euxLIumTZvSs2dP\njh496u3SRPIlhQERL9m8eTOBgYFMnz49017yhQsXvtyRrnPnzjgcjlysMm9r2rQpmzZtIioqikWL\nFhEYGMjEiRNJSUnxdmki+YrCgIiX1K5dm7Jly2Z6TPv27dmzZw/h4eEUL148lyrLX3x9fS8Pqeza\ntSuDBw+mfv36rFmzxtulieQbCgMiXnL27FkCAwPT3efv78/ixYtZsmQJAQEBuVxZ/lSuXLnLky2V\nKlWKli1b0qVLFw4dOuTt0kTyPIUBkVx28eJFoqKiCAwMZP369WlW+ytatOjlaXlDQ0O9WGX+dc89\n97Bu3To+++wz1qxZQ1BQEO+++y5JSUneLk0kz1IYEMlF69evp1GjRvTr14+//e1v7Nu3j0WLFlG4\ncGE6duxITEwMI0eOxM/Pz9ul5msOh4Nu3boRFxdH3759GTVqFLVr12bZsmXeLk0kT1IYEMkFR44c\n4bnnnqNZs2b4+vqyceNGPv30UypWrMhdd93F3r17+fe//82dd97p7VILlFKlShEREcGPP/5I1apV\nad++PY8//jgHDhzwdmkieYrCgEgOSk5O5oMPPiAwMJAlS5Ywbdo0fvjhBxo3bpzmuOrVq3upQnuo\nVasW3377LQsWLGD79u3UqlWLN998k7/++svbpYnkCQoDIjlk1apV1KtXj6FDh9K9e3fi4uJ48cUX\nbTFbYF7kcDjo1KkTMTExDBs2jPfee4/g4GC+/PJLLYAktqerkoiH/fzzz3Tu3Jk2bdpQtmxZtm3b\nRmRkZJbDCCV3FC9e/HInzTp16tCxY0fatm1LTEyMt0sT8RqFAREPOX/+POHh4QQHB7Nu3TrmzJnD\nd999R926db1dmqQjICCAxYsX8/XXX5OQkECdOnUYNmwYp0+f9nZpIrlOYUDEA5YsWcLdd9/N22+/\nTf/+/YmNjaVr166aLTAfePTRR9m9ezejR4/m448/JigoiDlz5ujWgdiKwoDITYiPjyc0NJTQ0FD8\n/f3ZtWsX48aNo2TJkt4uTa6Dn5/f5SmfW7RoQbdu3WjRogU7duzwdmkiuUJhQOQGnD17lpEjRxIS\nEsLu3bv58ssvWb58OTVr1vR2aXIT7rjjjsuLQZ04cYIGDRrQv39/Tpw44e3SRHKUwoDIdbAsiwUL\nFhAcHMyECRMYPnw40dHRPPHEE7olUIC0atWKHTt2EBERwZw5cwgMDGTatGm4XC5vlyaSIxQGRK5D\ncnIyffv25Z577iE6OprRo0dTrFgxb5clOaBQoUIMGjSI2NhYQkNDefnllzl16pS3yxLJEQoDIgBH\nj8ITT8DmzZke5nQ6Wb9+PV999RX+/v65VJx4U+XKlZk5cya7d++mTJkyWT/gs8/g5MmcL0zEgxQG\nRAAqVYLAQBgyBCZNyvAwh8NBUFBQLhYmecVdd92V+QiDI0dgxAh4/XX4+ee0+zQyQfI4p7cLEPGq\nbdugcmW47TZ47z2YNw9efRVuuQW6d7/mcPULsLcM//+fPw+9e5s3/a++gjp1zPcXL4LTCe7HuVyg\nGSglD9KrUgo+yzIX4att2QLdusGmTanbnn4ann0WPvkEvvkm92qU/Ov0aQgPN8FyyhRo1Mhs37kT\nJkyAgQNh7VqzTUFA8ii9MqXgczjMRfjPP9M21zZsCPXqmVDwxx+p23v1gipVYNy43K9V8p+FC2HN\nGhg61LxuLl40248dg19/hVOnTH+U++6DXbvMPt02kDxGYUAKvk2boFUr8+bfsaNpxnV7/HFYsiT1\nIg1w113QqRPs3p36iU4kPUlJ8O9/Q9Wq8MwzZpv703+bNhARAbNmwd69UKMGTJ5s9ul2k+QxCgNS\ncKT3aSs+HgYMMJ0DP/gAChc2n/w/+sjs79wZevaE+vXTnuOee8zXF1/kTu2SP/3vf6bF6YEHoGJF\ns839Rm9Z5vWWkgLly5t+BP/9Lxw44L16RTKgDoRScDgckJwMhw/DnXeabe6L74oVULo0dOhgwsDc\nudCgATRpYsLClecA09xbo4Zp4k1MhBIlcv/3kbzv11/Nm36zZuZny0p9DTkc5mfnpcvsxYumY6pa\nBSQPUsuAFBx//gmDBsGYManb9u0zF+pChVK39eoFxYrBp5+any0rbauC+xNd+fJm/oHixXWPV9Jy\nvx6OHjUjCUJCzM9Xtgq4fz54EIYPh3/+E9q1g+rVb+y5RHKQwoAUHGXKmItyYqLpFAhQsiTs2WM+\n4bs1bGg6c23fbi7UV39Sc198H3zQ9BtwOPRpTtJyvx62bjV9A8DcDnA7dw527IAePeDee2HjRhg9\nGt54w+zP7rTGV7Y0iOQghQEpGNxv4A88YP6dN8/826MH7N9vhn25+fiY/gCWZQIBpL3gujuAHT1q\nAsGff+Zo6ZJPWZbpB3DhgnlzdzrNqJR//AMeewz+9jc4exZmz4bly6FLF/DzM4/NzhDDc+dMK9ec\nOde2Dqi1QDxMfQakYHC/mYeEQPPmZhIhlwvuuAMefhgmTjTbS5Uyx7VqZSYVSm96WfensXLloGbN\n9I8Rcb9GTpwwb+4nT8KoUTB1Kjz6qGkNqFw59fjsTjjkfv3t2GHmKihS5NrWAU1iJB6mMCB5T3oX\nuOw0l7qP6d8/7fYxY6BpU1iwAF54wWzbs8f0I3Cm8yfgfp42baBu3Rv7HcQe2raFli3N97fcAuPH\nQ4UKJnw+/DD07Qsvvmhea9l903a//lavNn1XnnrK/JyUBD/8ABs2mA6uXbsqCIjH6JUkeYe76dN9\ngdu+3VwQz5/P3n3TK49xn8vlMn0E+vUzs8E9/TR8/jm8/DI88ogZTZDZ+dzDxUTSExAAwcHme8sy\no07eecf0UXn+eTMzYdmy8N13aR/nnpgoI8eOmVExt94K/v7mlsHrr5vX7Lp1Zg2Eu++G2NhrH6tb\nCHIDFAYk73C/mc+bZ5rnH3/cvGm3bm1meIOsL6JXn8vtH/8wHbguXDAX6JYtTXOur6/Hyhebcw8l\ndHckHDwYDh0ykxLdfXfqcefOZf26q1ABIiPNKAQwAePrr838GIsXm46LFSvCv/5l9l8ZANThUG6A\nwoB41/btqVMBW5bpbf3OO9Cnj7lnOmmSuTC6pwa+3jdvdytDiRJmgqHZs80tggkTzDZ9ihJPcjhS\nbz25Q8HDD5vWAYDffjNDVZcty/w87tEGFSqYVoJJk8zfRNeuZnv58iYwu8/jcKT2WTh2LPU82Q3P\nYnsKA+Jdzz8P//mP+d7hMPdgIyLMp6qyZU2rQIkSZgZBT7xxFytm/r14UcO2JGdd3R9l50545RUz\n1LBOncwf6+OT+kb+ySemo2LXrqYPgVtiItx+u+nACGYirTVrUmc43LcPatVKO6xWJAMKA+I9x46Z\ne67VqqVua94c2rdP/Xn+fPjxR3NRc3/iuXqCoBvh66sgILmrSBFo3NjcNrj99qyPd7eCzZhhhiVW\nqpS6b98+0xJQrlxqq8OyZebWmnsCpFKlzDob+/Z59veQAklhQLynQgUz/Mr9CejKUQSHD5tWgv79\nTXNoZKQJClu3pn0T1xu65BdBQfDqq2YkQHbFxZl/mzZN+1pft860ADzyiPl5+XI4csSsseGeOtvd\ncfHK2TdFMqAwIN7h/kRfp45ZN+Bqt90Gb71lJgxasMAsCOPvb3pRQ+r92Fmz0q5CKFKQlCxpAvKh\nQ6nbfvnFtAJUqQJPPmm2Pfyw+Ttp1Cj1uP/9z6zR4Z5bQyQTCgPiHQ6HGTJ4113w00/w11/Xjplu\n1swsLgRm4p9GjcwnJfdsbwBvvpm6smB2p3gVyS9uvdW0CmzdCqdPmxazIUMgIcF0KITUYFy9eto3\n/v37TevAmTO5X7fkOwoD4j1+fuaTy7FjZiIVyPgN/fBhWLXKdDj08TFDBMHMH+C+zaAJWKQgGjDA\n3E7z9zf9adauNaNhOnQw+9ObOOvUKbOuhsuVdWdFETQDoXhbu3awcKG559m6deobussF8fFmbvcf\nfjDjq2+7DZ591ux396quVi3ziYNE8rtGjWDvXjMB14ULZlbMypUz7zy7dy98+y307Jl7dUq+pjAg\n3lWrlpn2d9UqM6lKaKjZfuKECQhRUeaT/4AB104zDKaXtUhBdvGiGVngnvbY7erOs+4OuCdOmBEL\nLhe89FLu1Sn5msKAeF/PnmbioSFDTEuBr6+ZVOWxx8wqhFc2c7ovjCJ24X69Z3dejOnTTWvawIGp\nIwtEsqCbrOJ91aqZGQb9/Mz0wz/8kLrdHQTcnaQUBMSuMgoC7tsFlgWbNpnptp96yvSvEckmhQHJ\ndVZ6a7OXKGEmGCpe3ExHnJiY9pj0OkmJSGpImDrVjK558UVzW+2qVoFr/u5ErqArrOSqJUuWcPjw\nYXr06IHT/QbvvpgFB5te0qtWQXKy94oUyW8uXDBDCN95B2rXNtuuuK2QnJzMkiVLSExMpGvXrjg0\nWZdcRS0Dkivi4+MJDQ0lNDSU1atX45tec7/7k0vr1mZeARHJnsKF4bXXzLoHRYuabVe84RcqVIgf\nfviBbt260aJFC3bs2OGlQiWvUhiQHHX27FlGjhxJSEgIu3btYuHChcydOzf9Tyb6tCJy47L4+xk7\ndiyrVq3ixIkTNGjQgP79+3PCvciR2J7CgOQIy7JYsGABwcHBTJgwgeHDhxMTE8OTTz6pJkoRL2nV\nqhU7duxgwoQJzJ49m8DAQKZNm8ZFLXVsewoD4nHR0dG0adOGzp07U79+faKjoxk9ejTF3MsHi4jX\nFCpUiMGDBxMXF0doaCi9e/emcePGbNy40duliRcpDIjHnDp1iiFDhlC3bl1++eUXli5dyqJFi/D3\n9/d2aSJylcqVKzNz5ky+//57XC4XTZs2pWfPnhw9etTbpYkXKAzITXO5XHz22WcEBQUxdepUxowZ\nw65du2jXrp23SxORLNx3331s3ryZqKgoFi1aRGBgIBMnTiTFPbeH2ILCgNyUbdu2cf/99/Pcc8/R\nsmVLYmNjGT58OEWKFPF2aSKSTb6+vvTp04e4uDieeeYZBg8eTP369VmzZo23S5NcojAgN+T48eP0\n69ePhg0bcubMGVavXs28efOoUqWKt0sTkRtUrlw5pkyZwpYtWyhZsiQtW7akS5cuHDp0yNulSQ5T\nGJDrcvHiRaKioggMDOTzzz/nww8/ZPv27Tz44IPeLk1EPOSee+5h3bp1zJo1izVr1hAUFMS7775L\nUlKSt0uTHKIwINm2fv16GjVqRL9+/Xj88ceJi4tj4MCBqTMJikiB4ePjQ/fu3YmNjaVv376MHDmS\n2rVrs2zZssvHzJ07ly+++EJTHRcACgOSpSNHjvDcc8/RrFkzfHx82LBhAzNmzKBSpUreLk1yWf36\n9UlOTqZ+/freLkVySenSpYmIiODHH3/kjjvuoH379jz++ONs2bKFAQMG8Pe//53WrVuzZ88eb5cq\nN8FhKdJJBpKTk4mMjOStt96icOHCjB07lp49e6Y/lbCIFHiWZbFw4UKGDBnCr7/+isvlurzP19eX\nAQMG8Pbbb1O6dGkvVik3QmFA0rVq1SoGDhzI3r176devH++88w5ly5b1dlkikgesXbuWFi1apLuv\nYsWKjBs3jm7duuHjo8bn/EL/pySNn3/+mc6dO9OmTRvKlCnD1q1biYyMVBAQEcDMKzJs2LAM9//+\n++88//zzNGvWjK1bt+ZiZXIzFAYEgPPnzxMeHk5wcDBr165l9uzZrF27lnr16nm7NBHJQxwOB4MH\nD+b222/P9LiNGzfSqFEj+vbty/Hjx3OpOrlRuk0gLFmyhFdeeYWDBw8yaNAgRo0aRalSpbxdlojk\nYYmJiYSHhxMREUFycnKmx5YpU4bw8HB69+6tPkd5lMKAjcXHxzNo0CCWLFlCmzZtmDRpEsHBwd4u\nS0Tykbi4OF555RW++eabLI+tV68ekZGRNGvWLBcqk+uhMGBDZ8+eZezYsYwfP57KlSvzwQcf8MQT\nT2hpYcnc7t2wfDls3w5//AFFi8Kdd8L998Ojj5qfxZYsy2Lx4sUMGjSIhISELI/v1q0b7733Hrfe\nemsuVCfZoT4DNmJZFgsWLCA4OJgJEyYwfPhwYmJiePLJJxUEJGNLl0LTptCgAcyda7bddReULw/7\n9sHLL8Ott8KQIaB7w7bkcDjo0KEDe/bsYfTo0fj5+WV6/OzZswkKCsrWLQbJHWoZsIno6GgGDBjA\nf//7Xzp06MAHH3ygpYUla5MmwSefwCuvQOfOkNH48c2bYfp0+Oor0BK4tvfTTz/x6quv8uWXX2Z5\nbHBwMJMmTaJNmza5UJlkRGGggDt16hSjR49m8uTJVK9enYkTJ2ppYcm+X3+FLHqNp/Hzz1C1as7V\nI/nKihUrGDhwILGxsVke27FjRyIiIrjzzjtzoTK5msJAAeVyuZgzZw6vvfYaZ86cYdSoUQwePFhL\nC4tIrrpw4QKTJk1i9OjRJCYmZnps0aJFGTFiBEOHDs3yVoN4lsJAAbRt2zZefvllNmzYQJcuXRg/\nfryWFpabs3w5JCdDaKi3K5F86vDhw7z22mvMdfc7yYS/vz8ffvghoaGh6s+US9SBsAA5fvw4/fr1\no2HDhpw5c4bVq1czb948BQG5ea+/fm1fgPBw8PFJ+yWSgdtuu405c+bw3XffUadOnUyPPXDgAB06\ndCA0NJR9+/blUoX2ppaBXJaYmEh8fDxJSUkUKVKEgIAASpQocVPnvHjxItOmTeONN94gJSWFMWPG\n8NJLL2lpYfGc0qVh/XoICUndtmGD6VT40Udw6hQ89xxcsXCNSEZSUlKYOnUqI0eO5OTJk5keW7hw\nYV599VXeeOMNihcvft3PlRPX3ALJkhy3Z88ea8CAAVbNGjUsh8NhAZe/HA6HVbNGDWvAgAHWnj17\nrvvc33//vVW/fn0LsHr06GEdOXIkB34Dsb2SJS0rPj7tth07LKt8efP9779blsOR+3VJvvb7779b\nvXr1uua6mN5XlSpVrH/961+Wy+XK8rw5ec0tqBQGctCBAwesRx56yAKsik6n1Q+sGWBtBGvnpX9n\ngNXv0n7AeuShh6wDBw5kee7ffvvN6t69uwVYDRo0sDZs2JALv5HYVv36lvXxx2m3jRtnWffea74/\nelRhQG7Ypk2brHvvvTfLQABYDz74oLVr1650z5OT19yCTmEgh0ybNs0q7udn3el0WnPBSgLLyuQr\nCay5YFV1Oq3ifn7WtGnT0j3vhQsXrPfff98qWbKkVa5cOeuTTz6xUlJScvm3E9uZNs2yihe3rLAw\ny1qyxLLeesuy/Pwsa8YMs//oUcvy8fFqiZK/Xbx40ZoxY4ZVoUKFLAOBr6+vNWjQIOvkyZOXH59T\n11y7UBjIAWFhYRZgvQjW6SxekFd/nb70OMAKCwtLc96VK1datWrVsnx8fKz+/ftbx48f99JvKLY0\nerRllStn3vSrVrWsyZNT9yUlWdb8+d6rTQqMP//80xo4cKDl6+ubZSioWLGi9c9//tMaM2ZMjlxz\n7URhwMOmTZtmAdaY63xBXv31zqUX5/Tp062DBw9aTz31lAVYzZo1s7Zv3+7tX1Ps7MIFb1cgNrBz\n507rgQekXiAkAAAgAElEQVQeyNatA09fc+1Iowk8KCEhgdq1avH0+fNMu8lzWUAvYI7TicPp5JZb\nbmH8+PF07dpV425FxBYsy2L+/Pm8+uqrHD58ON1jfIAewPQMzrEBWAEMBjJbmN0CegPz/PzYFR1N\n9erVb7zwfEhhwIPatW1LzOrV7EpJoaQHzncaCAb87ryT7Tt3UqpUZi9lkRzw8cfQrh3Y7MIoeUti\nYiLh4eHXLGzkA9wKxECG19wI4DUgAchqouzTQG2nk1otW7JsxYqbLzwf0SwhHhIdHc03337LPzwU\nBMCk2PHAgYMH+fXXXz10VpHrEBMDNWtqQiHxqhIlSjB27Fh2797NI488cnm7CxhHxkEAzCf+7CoF\njE1J4ZtvvyUmJubGis2n9BfuIVFRUVR0OumUxXGJwCCgOuAHVALaAjsyOL4jUNHpZMqUKR6rVSTb\nJk+G6GiYOdPblYgQGBjI0qVLWbRoEaVKlaIsZHrNHY1pFQCohnnD8wV+zuQxdr3maoo6D/l26VI6\npqRQOIvj+gBfAgMwtwCOA+swzVz10jm+CNAxJYWVy5Z5slyR7KtRw3yJ5AEOh4MOHTpwa/nytDp9\nOtNrbkcgDvgXMBEod2l7hUweY9drrvoMeMCZM2coXbo0n1oWPbI4tgzQDZh0HeefAbzocHD69GlN\noykitnc919zr6TPgZsdrrm4TeMD+/fuxLIta2Tj2FuAH4LfrOH8IpldtfHz8DdUnIlKQXM8190bY\n8ZqrMOABSUlJABTLxrHjgN3AHUBjzD2thCweU/Sq5xERsbPruebeCDtecxUGPKBIkSIA/JWNY58C\nDgCRwO3ABEwKXZ7JY85d9TwiInZ2PdfcG2HHa67CgAcEBATgcDiIzubxlYC+mI6ECZhOLeGZHL8H\n02kmICDg5goVESkArueaeyNTtNnxmqvRBB5QokQJgvz92bx/f6adWVyYoYVXTh1UHrgNyKwxagtQ\ns0YN23RkkXxk9Oi0P7/1lnfqEFspUaIEAXfeyeaffsqyA2HxS/+eJPsdCO14zVXLgIc81L49C51O\nLmRyzBnMrYEewIeY6TP/jnnhPZPBY5KAhU4nbdq182S5Ip5x8GDaL5EclpKSQmRkJAcPH2Y+ZHrN\nBWiAmXhoBDAHmE/qbYD02PWaq6GFHhIdHU1ISAhzyfiNPRkYhZkn+wCmpSAAc8ugdwaP+Rzoeun8\nwcHBni1aRCQfWbt2LS+//DI7d+68vC2za67bP4AozCguF5kPM7TrNVdhwINyam0CKlXihy1bqFKl\nigfOKnKTkpPhjz/M9+XLQ6FC3q1HCrzDhw8zbNgwPv/88zTbs7M2wfXQ2gTiER9PncofTidDPHAu\nCxgCnChUiAsXLxIUFMS7775rq6Euksd88QU0aQLFisHtt5uvYsXMtvnzvV2dFEAXLlxg/PjxBAUF\nXRMEwHzK/w2zIuHNsoBXgeNOJx9PneqBM+YvCgMeVL16dT6cPJnpQNhNnMe69PhPgcgpU4iPj6dv\n376MHDmS2rVrs8xm02RKHvDxx/D889C4MSxcCBs2mK+FC822556Djz7ydpVSgKxYsYI6derw2muv\nkZiYmOFxLsy10hPX3OnAxMhI2y1fDIAlHhcWFmYB1otgnQbLuo6vU5ceB1jh4eFpzrt7926rVatW\nFmB16NDB2r9/v5d+Q7GdO++0rFmzMt4/a5ZlVauWa+VIwZWQkGA98cQTFpeug5l9BQcHWytXrsyx\na66dKAzkkGnTplnF/fysqk6nNRespCxekOfBmgtWVafTKu7nZ02fPj3d87pcLmvBggXWHXfcYRUp\nUsQaNWqUdfbs2Vz+7cR2/PwsKyYm4/0xMeYYkRv0119/WW+//bbl5+eXZQgoWbKkFRERYV24cOHy\n43PqmmsXCgM56MCBA9YjDz1kAVZFp9PqB9anYG0E68dL/34KVr9L+wHrkYcesg4cOJDluRMTE603\n3njDKly4sFW1alVr4cKFlsvlyoXfSmypSRPL6t3bstJ7jblcZl/jxrlfl+R7LpfL+uqrr6xq1apl\nqzWge/fu1uHDh9M9V05ecws6jSbIBdHR0URFRbFy2TL2Xlpgw83hcFCzRg3atGtHv379rnsoS3x8\nPIMHD+brr7+mTZs2TJo0yVbDYSSXbNkCDz9sOgy2bg2VKpntR4/CypXw11+wfDk0auTdOiVfiY2N\n5ZVXXmH58swmZDfq1atHZGQkzZo1y/LYnLzmFlQKA7ksMTGR+Ph4kpKSKFKkCAEBAR6Z5errr79m\n0KBBHDx4kEGDBjFq1ChKlSqV9QNFsuvYMZg5E9avhyNHzLbKlaFpU+jZ0wwzFMmGxMREwsLCeP/9\n90lOTs702DJlyhAeHk7v3r3x9fW9oefKiWtuQaMwUICcP3+e999/n7CwMEqXLs348ePp2rUrDseN\nzM4tIuJZlmXxr3/9i6FDh3L48OFMj3U4HPTu3ZuwsDDKK2jmOIWBAujnn39m6NChLFiwgPvvv5/J\nkydTr149b5clIja2c+dOBgwYwHfffZflsU2aNCEyMpIGDRrkQmUCmmegQKpatSpffPEFq1at4sSJ\nEzRo0ID+/ftz4sQJb5cmBU2rVtCyZeqXyFVOnjzJwIEDqV+/fpZBoGLFisycOZPvv/9eQSCXqWWg\ngEtOTiYyMpK33nqLwoULM3bsWHr27HlD995ErvHZZ2l/7t7dO3VInuNyuZg5cybDhw/n2LFjmR7r\n6+vLwIEDeeuttyhdunQuVShXUhiwiSNHjjB8+HBmzZpFgwYNiIyMpEmTJt4uS0QKoM2bN/Pyyy+z\nadOmLI9t2bIlkydPJiQkJBcqk4zoNoFNVK5c+XLzm8vlomnTpvTs2ZOjR496uzTJy7Lo6X3Tx0uB\ncuzYMXr16kXjxo2zDAJVqlRh/vz5rFq1SkEgD1AYsJn77ruPzZs3ExUVxaJFiwgMDGTixImkpKR4\nuzTJi8aPhy5dzDoEmTl50qxfEBiYO3VJnpKSkkJkZCSBgYFMnz6dzBqcCxcuzIgRI9i7dy+dO3fW\naKc8QrcJbOz48eOMHDmSqVOnEhISwuTJk3nwwQe9XZbkJUlJ8OGHMG4clCoFzZvD3XdD2bJw7hwc\nPgybNsH338P995vj7rnH21VLLlq7di0vv/wyO3fuzPLY9u3bM3HiRAICAnKhMrkeCgPCtm3bePnl\nl9mwYQN///vfmTBhAlWqVPF2WZKXJCWZFQqXL4ft280ERMWKwZ13moDQpQtoJjdbOXz4MMOGDUt3\naeGr+fv7M3HiREJDQ3OhMrkRCgMCmJ6/c+bM4bXXXuPMmTOMGjWKwYMHU6RIEW+XJiJ5iMvlIiIi\ngnfeeSfTpYUBihYtyogRIxg6dCh+fn65VKHcCPUZEAB8fHzo3r07sbGx9O3bl5EjR1K7dm2WLVvm\n7dJEJA9xOBysWrUqyyDQqVMn9u7dy8iRIxUE8gGFAUmjdOnSRERE8OOPP3LHHXfQvn17Hn/8cQ4c\nOODt0kQkD3A4HIwcORIfn/TfPoKDg1m5ciULFiygatWquVyd3CiFAUlXSEjI5T/o7du3U6tWLd58\n803++usvb5cmIl6SnJzMBx98QPv27SlcuHCafSVLlrz8QaJ169ZeqlBulMKAZMjhcNCpUydiYmIY\nOnQo7733HsHBwXz55ZeZDh2SguvChQv88ssvXLhwwdulSC5btWoV9erVY+jQoZdvKd52220Al38e\nMmQIhQoV8nKlciMUBiRLxYsXJywsjD179lCnTh06duxI27ZtiYmJ8XZpkst2795N1apV2b17t7dL\nkVzy888/07lzZ9q0aUOZMmXYunUrkZGRVK1alU8//ZR169Yxa9Ysbr31Vm+XKjdBYUCyLSAggMWL\nF7N48WISEhKoU6cOw4YN4/Tp094uTUQ87Pz584SHhxMcHMzatWuZPXs2a9euTbMC6iOPPEKzZs28\nWKV4isKAXLfQ0FB2797N6NGj+eijjwgKCmLOnDm6dSBSQCxZsoS7776bt99+m5deeonY2FieffZZ\nzRZYgCkMyA3x8/O7PKVo8+bN6datGy1atGDHjh3eLk1EblB8fDyhoaGEhoZSvXp1du7cyfjx4ylV\nqpS3S5McpjAgN6Vq1ap88cUXrFq1ihMnTtCgQQP69+/PiRMnvF2aiGTT2bNnGTlyJCEhIezatYuF\nCxeyYsUKgjWrpG0oDIhHtGrVih07djBhwgRmz55NYGAg06ZN4+LFi94uTUQyYFkWCxYsIDg4mAkT\nJjB8+HBiYmJ48skndUvAZhQGxGMKFSrE4MGDiYuLIzQ0lN69e9O4cWM2btzo7dJE5Cp79uyhTZs2\ndO7cmfr16xMdHc3o0aMpVqyYt0sTL1AYEI+rXLkyM2fO5Pvvv8flctG0aVN69OjB0aNHvV2aiO2d\nOnWKIUOGULduXX755ReWLl3KokWL8Pf393Zp4kUKA5Jj7rvvPjZv3kxUVBT/93//R2BgIBMnTiQ5\nOdnbpYnYjsvlYtasWQQFBTF16lTCwsLYtWsX7dq183ZpkgcoDEiO8vX1pU+fPsTFxfHMM88wePBg\nOnbs6O2yRGznlVde4fnnn6dly5bExsYyfPhwrUoqlykMSK4oV64cU6ZMYcuWLfTo0SPr1oHPPoOT\nJ3OnOJH87OhReOIJ2Lw5w0OSk5Pp3Lkzq1evZt68eVSpUiUXC5T8wOntAsRe7rnnHurXr59xT+Uj\nR2DSJJg1C+rVg1tuSd1nWaAeziJpVaoEgYEwZAg89RQMHHjNIYUKFaJ58+ZeKE7yC4UByXUZBoHz\n56F3b/Om/9VXUKeO+f7iRXA6U4OAywUZLJ8qYhvbtkHlynDbbfDeezBvHrz6qgnQ3bt7uzrJZ3RF\nlbzh9GkIDzcXuClToFEjs33nTpgwwXzaWbvWbFMQELuwLBN+r7ZlC3TrBps2pW57+ml49ln45BP4\n5pvcq1EKBF1VJW9YuBDWrIGhQ6FKFdMaAHDsGPz6K5w6Ze6L3ncf7Npl9mktBCnoHA4Tfv/8M+3r\nvWFDcxttyxb444/U7b16mb+fceNyv1bJ1xQGxPuSkuDf/4aqVeGZZ8w296f/Nm0gIsL0Idi7F2rU\ngMmTzT71H5CCbtMmaNXKvPl37Ghun7k9/jgsWZIajgHuugs6dYLdu1Nb0kSyQWFAvO9//zOffB54\nACpWNNvcb/SWBYULQ0oKlC9v+hH8979w4ID36hXxtPRaueLjYcAA0znwgw/M30GvXvDRR2Z/587Q\nsyfUr5/2HPfcY76++CJ3apcCQR0Ixft+/dVcyNzrol85asDhMD87L71UL140HaTUKiAFicMByclw\n+DDceafZ5g69K1ZA6dLQoYMJA3PnQoMG0KSJCQtXngPMbYIaNcyttcREKFEi938fyXfUMiDe4/4k\nc/SoGUkQEmJ+vrJVwP3zwYMwfDj885/Qrh1Ur35jzyWSF/35JwwaBGPGpG7bt88E5EKFUrf16gXF\nisGnn5qfLSvta9vdkla+vPm7Kl5cr33JFoUB8R73m/7WraZvAJjbAW7nzsGOHdCjB9x7L2zcCKNH\nwxtvmP3p9bJOj+YnkLyuTBkThhMTTadAgJIlYc8e8wnfrWFD04l2+3YTkK9+Xbvf+B980PQbcDj0\n2pdsURgQ77Is0w/gwgXz5u50mt7R//gHPPYY/O1vcPYszJ4Ny5dDly7g52cem50hhufOmU9bc+Zc\n+wlJn5gkL3C/Dh94wPw7b575t0cP2L/fDLd18/Ex/QEsywQCSPtm7/6bOHrUBII//8zR0qXgUJ8B\n8S6HA8qVgxMnzIXs5EkYNQqmToVHHzWtAZUrpx6f3QmH3K0BO3aYuQqKFLn2E5ImMZK8wP06DAmB\n5s3NJEIuF9xxBzz8MEycaLaXKmWOa9XKTCpUpsy153K/7suVg5o10z9GJB0KA+J9bdtCy5bm+1tu\ngfHjoUIFcxF8+GHo2xdefNHcO83um7b7Art6tbmH+tRT5uekJPjhB9iwwXS06tpVQUA8J71gmZ3b\nVO5j+vdPu33MGGjaFBYsgBdeMNv27DF/C850Lt/u52nTBurWvbHfQWxJV0HxvoAACA4231uW6f38\nzjvmXunzz5uZCcuWhe++S/s498REGTl2zPTOvvVW8Pc3twxefx0eeQTWrYMRI+DuuyE29trH6haC\nXA/368UdBLZvN0H0/Pns3bO/8hj3uVwu00egXz8zC+fTT8Pnn8PLL5vXcJMmmZ/PPUxXJBsclqWr\nnuQxV65H4LZ8uZmiuGxZ8/O5c1C0aPbOd+yYaWl4/XUz0+Hrr5v7sX/8YcZqP/AAvPWWOhpmomnT\npmzcuDHNtiZNmrBhwwYvVZRHzZtnOrn+9ZfpAHjLLSbMPvigeU37+mb/XO5WhsREWLoU5s83E2+1\nawdvv60hg+JRahmQvMfhSA0C7tEFDz+cGgR++80MmVq2LPPzuEcbVKhgAsGkSdCnj7k1AGb4Vc2a\nqedxOFL7LBw7lnqerFogxJ62b0+dCtiyzCiXd94xr7EdO8zrrUKF1KmBrycIQGorQ4kSJrTOnm1u\nEUyYYLbpc5x4kMKA5G1X3xfduRNeecUMNaxTJ/PH+vikvpF/8onpVNW1q+lD4JaYCLffbjowgpnQ\nZc2a1BkO9+2DWrXSDu8SAXML6z//Md87HKbvS0QEDB5sgmvr1uZNOzDQM2/cxYqZfy9eVCuWeJzC\ngOQvRYpA48ZmLYPbb8/6ePensRkzzLDESpVS9+3bZ1oCypVLbXVYtszM+e6eAKlUKTPf+759nv09\nJH87dsz0dalWLXVb8+bQvn3qz/Pnw48/mjDpbmm6eoKgG+HrqyAgHqcwIPlLUJBZs71Klew/Ji7O\n/Nu0adqL6Lp1pgXgkUfMz8uXw5EjZq539/1Yd8fFK2eBE6lQwQx7dbc8XTmK4PBh00rQv7+5DRUZ\naYLC1q1pX396Q5c8RGFACr6SJc2F+tCh1G2//GJaAapUgSefNNseftgM4WrUKPW4//3PzBXvHuMt\n4v5EX6eOWTfgarfdZjqk7t9vXk//+58ZzTJihNnv7gcza1baVQhFvEhhQAq+W281rQJbt8Lp0+aT\n25AhkJBgOntB6gW6evW0b/z795vWgTNncr9uyZscDjNk8K674KefzMiBq+cWaNbMLC4EZuKfRo1M\nC5V7lk2AN99MXVkwu1Nri+QQhQGxhwEDTLOuv7+5r7t2remV3aGD2Z/eBC6nTpn53V2urDsrir34\n+ZkWo2PHzARWkPEb+uHDsGqV6XDo42Om3gYzf4D7NoMmvhIv0wyEYg+NGpkx2qtXm4tx3bpmmuPM\nOnHt3QvffmvWjBe5Wrt2Zt6K5cvNyAH3G7rLBfHxZk2NH36Ajz4ytw6efdbsd49mqVYt84mDRHKR\nwoDYg3vCF/e0x25Xd+JydwQ7ccKMWHC54KWXcq9OyT9q1TLT/q5aBV9/DaGhZvuJEyYgREWZ192A\nAddOMwxmdItIHqEwIPbgHmKY3fHZ06ebT3UDB2qmN8lYz55m4qEhQ0xLga+vmczqscfMzJZX3l66\n3hkIRXKRblSJvWQUBNy3CywLNm0yU8g+9ZS5zyuSkWrVzAyDfn5mzYAffkjd7g4C7s6pCgKShykM\niEBqSJg61fTyfvFF07x7VauAlvKwt2v+/7sX1po/30yR/c47ZlbLK6XXOVUkj1EYEHG7cMEMIXzn\nHQgLM9uuuvhblsX333/PRa1XYCuWZbF+/XocV7csuX8ODjajU4YMgeTk3C9Q5CYpDIi4FS4Mr71m\n1j1wr4h41cX/woULPPzwwzRu3PiaVfykYNqzZw+tW7emefPmHDt2LP3WIfe21q3NvAIi+YzCgMiV\nsuhc6Ofnx4oVK3C5XDRt2pQePXpw9OjRXCpOctOpU6cYMmQIdevW5dChQ3z99ddUqFDh2tYB0NTC\nku8pDIhcp/vuu4/NmzcTFRXF//3f/xEYGMjEiRNJVvNwgeByuZg1axZBQUFMnTqVsLAwdu3aRbt2\n7bxdmkiOURgQuQG+vr706dOHuLg4nnnmGQYPHkz9+vVZvXq1t0uTm7Bt2zbuv/9+nn/+eVq2bEls\nbCzDhw+nSJEi3i5NJEcpDIjchHLlyjFlyhS2bNlCqVKlaNWqFV26dOHQlYsiSZ53/Phx+vbtS8OG\nDTlz5gyrV69m3rx5VLme1TFF8jGFAREPuOeee1i3bh2zZs1izZo1BAUFMXbsWJKSkrxdmmTi4sWL\nREVFERgYyLx58/jwww/Zvn07Dz74oLdLE8lVCgMiHuLj40P37t2JjY2lb9++jBo1irvvvpulS5d6\nuzRJx/r162nUqBH9+vXj8ccfJy4ujoEDB+LUvABiQwoDIh5WunRpIiIi+PHHH6latSqPPvooHTp0\nYP/+/d4uTYAjR47w3HPP0axZM3x8fNiwYQMzZsygUqVK3i5NxGsUBkRySEhICCtXrmTBggXs2LGD\nkJAQ3nzzTf766y9vl2ZLycnJvP/++wQGBrJkyRI++eQTfvjhB5po5UARhQGRnORwOOjUqRMxMTEM\nHTqU9957j+DgYBYuXJhm8poNGzbgcrm8WGnBtmrVKurWrcuwYcPo3r07cXFx9OrVC1+tFyACKAyI\n5IrixYsTFhbGnj17qFOnDp06daJt27bExMSwbds2mjVrRrNmzdi6dau3Sy1Qfv75Z5566inatGlD\n2bJl2bp1K5GRkZQtW9bbpYnkKQoDIrkoICCAxYsXs3jxYhISEqhduzahoaFYlsXGjRtp1KgRffr0\n4Y8//vB2qfna+fPnCQ8Pp2bNmqxbt47Zs2ezdu1a6tWr5+3SRPIkhQERLwgNDWX37t088cQT/Pbb\nb5e3W5bFJ598QmBgIB9//LEWRLoBX3/9NSEhIbz99tv079+f2NhYnn322fSnERYRQGFAxGuSkpJY\nu3Ztuvv+/PNP+vfvT8OGDfn+++9zubL8KT4+ntDQUB577DH8/f3ZuXMn48ePp1SpUt4uTSTPUxgQ\n8ZKDBw9S1L06YgZ27NjB/fffT/fu3dO0IEiqs2fP8sYbbxASEsKuXbtYuHAhK1asIDg42NulieQb\nCgMiXlKnTh2io6MZPXo0fn5+mR47e/ZsgoKCiIiI0IJIl1iWxYIFC6hZsyYREREMHz6cmJgYnnzy\nSd0SELlOCgMiXlS0aFHefPNNYmJieOKJJzI99syZMwwdOpS6deuycuXKXKowb9qzZw+tW7emc+fO\n3HPPPZdDVbFixbxdmki+pDAgkgdUq1aNL7/8kuXLlxMUFJTpsTExMTz00EN06tSJgwcP5lKFecOp\nU6cYMmQIdevW5dChQyxdupRFixbh7+/v7dJE8jWFAZE8pG3btuzcuZNx48ZRokSJTI9duHAhwcHB\nhIWFcf78+Vyq0DtcLhezZs0iKCiIqVOnEhYWxq5du2jXrp23SxMpEBQGRPKYwoULM2zYMGJjY+na\ntWumx547d45Ro0YREhLC4sWL08xqWFBs27aN+++/n+eff56WLVsSGxvL8OHDKVKkiLdLEykwFAZE\n8qjbbruNOXPm8N1331GnTp1Mjz1w4AAdOnQgNDSUffv25VKFOev48eP07duXhg0bcubMGVavXs28\nefOoUqWKt0sTKXAUBkTyuObNm1+eRveWW27J9NilS5dy9913M2LECM6ePZtLFXrWxYsXiYqKIjAw\nkHnz5vHhhx+yfft2HnzwQW+XJlJgKQyI5ANOp5P+/ftfXmAns6FzFy5cYOzYsdSsWZP58+fnq1sH\n69evp1GjRvTr14/HH3+cuLg4Bg4ciNPp9HZpIgWawoBIPlKhQoXLS+/ee++9mR576NAhunTpQqtW\nrdi9e3cuVXhjjhw5wnPPPUezZs3w8fFhw4YNzJgxg0qVKnm7NBFbUBgQyYcaNWp0+Q2zQoUKmR67\nZs0a6tWrx+DBgzl16lQuVZg9ycnJvP/++wQGBrJkyZLLQadJkybeLk3EVhQGRPIpHx8fevTocbkp\n3dfXN8NjL168yIcffkhgYCAzZ87E5XLd9PPf7CJKq1atom7dugwbNozu3btfvgWS2e8hIjlDYUAk\nn7vllluYOHEi27dv54EHHsj02N9//50ePXrQrFkztm7dmuW5o6OjGThwILu3b79m3+bNmwkOCGDg\nwIFER0dnu96ff/6Zp556ijZt2lC2bNnLnSPLli2b7XOIiGc5rPzUu0hEMmVZFvPnz+fVV1/l8OHD\nmR7rcDjo1asX4eHhlC9fPs2+hIQEXurTh2++/ZaKTicdU1JoBNQCigF/AdHAZmCh08nvKSk88tBD\nfDx1KtWrV0/3+c6fP09ERATh4eGULl2a8ePH07VrV60jIJIXWCJS4Jw5c8YaPny4VahQIQvI9KtM\nmTLWRx99ZKWkpFiWZVnTpk2zivv5WXc6ndZcsJLAsjL5SgJrLlhVnU6ruJ+fNW3atGvqWbx4seXv\n7285nU5r6NCh1qlTp3L7P4mIZEItAyIFWFxcHK+88grffPNNlsfWq1ePRo0aMW3aNF4E3gdKXsdz\nnQGGANOBsLAw3njjDeLj4xk0aBBLliyhTZs2TJo0SUsLi+RBCgMiBZxlWSxevJhBgwaRkJCQ5fFj\ngJE38XxjgDeB9u3bs3LlSipXrswHH3zAE088oVsCInmUwoCITZw7d47x48czduzYdBc28gF6YD7Z\n3wwL6AXMBF4aMIB3331XSwuL5HEaTSBiE0WLFuXNN98kJiaGJ598Ms0+H+BW4AMPPI8Dc4vhdl9f\n9u3dqyAgkg8oDIjYTLVq1Vi4cCHLly8nKCgIABcwjtQ+ArswF4evr3jctkvbGl51vnZA06u2lQLG\nXrzIN99+S0xMjId/AxHxNIUBEZtq27YtO3fupFmzZpQFOl2x727gFuC7K7atxVwwfgQSL22zgA1A\nerMbdAQqOp1MmTLF47WLiGcpDIjYWOHChTl+5Ah/Bwpfsd0BNMMEALe1wBOX9q2/tG0HcBq4P51z\nF43rJWAAAARjSURBVAE6pqSwctkyj9ctIp6lMCBiY2fOnCH2wAEapbOvOebWwLlLP68D2gN1SQ0J\n7taC9MIAmFsKe/fvJzExMYMjRCQvUBgQsbH9+/djWRa10tnXHEjG3AaIA45d2taC1DCwDjMr4S0Z\nnD8EM7QxPj7eo3WLiGcpDIjYWFJSEmCmGL5aQ8AP029gLVARCMAEgk3AhUvbm2dy/qJXPY+I5E1O\nbxcgIt5TpEgRwKw1cLVCwL2YMFCV1Df95kASMBc4imkpyIj7FoP7eUQkb1LLgIiNBQQE4HA4yGjN\nwebAD8AaUsNAOaAm8B6mM2FmLQN7MAsiBQQEeKZgEckRCgMiNlaiRAmC/P3ZnMH+5phP97+Q9k2/\nBaYfQTXgtkzOvwWoWaMGJUqU8EC1IpJTFAZEbO6h9u1Z6HRyIZ199wG+mEmE6l6xvTmmVSCzWwRJ\nmOWN27Rr57FaRSRnaG0CEZuLjo4mJCSEucAzHjzv50DXS+fXSoUieZvCgIjQrm1bYlavZldKynUt\nW5yR00Btp5NaLVuybMUKD5xRRHKSwoCIkJCQQO1atXj6/Hmm3eS5LKA3MM/Pj13R0VSvXt0DFYpI\nTlKfARGhevXqfDh5MtOBsJs4j3Xp8dOBiZGRCgIi+YTmGRARAF588UWOHj3KyJEjOYhZhvh6bhmc\nBl7FBIHw8HBeeOGFnChTRHKAbhOISBrTp09n0IABlEtJYWxKCp1Iu4jR1ZKAhcDrTifHnU4mRkYq\nCIjkMwoDInKNhIQEXurTh2++/ZaKTicdU1JoiFlroChm7oE9mHkEFjqd/J6SwiMPPcTHU6fq1oBI\nPqQwICIZio6OJioqipXLlrH30qJGbg6Hg5o1atCmXTv69eun4YMi+ZjCgIhkS2JiIvHx8SQlJVGk\nSBECAgI0s6BIAaEwICIiYnMaWigiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjan\nMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJi\ncwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIi\nIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAg\nIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMK\nAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2\npzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIi\nYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjb3/8JdT1NDbuw8\nAAAAAElFTkSuQmCC\n", "text/plain": [ "<matplotlib.figure.Figure at 0x10296e278>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 例のグラフを作成\n", "\n", "import networkx as nx\n", "import matplotlib.pyplot as plt\n", "from collections import deque\n", "\n", "# Lecture1の例のグラフGを生成\n", "G = nx.DiGraph()\n", "G.add_edges_from([('s','v',{'capacity': 3}),('s','w',{'capacity': 2}),('v','w',{'capacity': 5}),('v','t',{'capacity': 2}),('w','t',{'capacity': 3})])\n", "for e in G.edges():\n", " G[e[0]][e[1]]['flow'] = 0\n", "\n", "# 描画\n", "\n", "pos={'s':(0,2),'v':(3,4),'w':(3,0),'t':(6,2)}\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": "markdown", "metadata": {}, "source": [ "Initializeがきちんと動くか確認してみる。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "Gf = makeResidualGraph(G)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "Initialize(Gf, 's', 't')" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Gf.node['s']['height']" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Gf.node['v']['height']" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Gf.node['t']['height']" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "['s', 't', 'v', 'w']" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Gf.nodes()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Gf['w']['s']['capacity']" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "the excess of the node w: 2\n", "the excess of the node t: 0\n", "the excess of the node v: 3\n" ] } ], "source": [ "nodelist = Gf.nodes()\n", "nodelist.remove('s')\n", "for p in nodelist:\n", " print( 'the excess of the node ' + p +': ' + str(Gf.node[p]['excess']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "上手く動いているみたいだ。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Push" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "code_folding": [ 1 ], "collapsed": true }, "outputs": [], "source": [ "import numpy as np\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", " augment the flow of (v,w)\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", " # (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", " G[w][v]['flow'] -= diff\n", " G[v][w]['capacity'] -= diff\n", " G.node[w]['excess'] += diff\n", " G.node[v]['excess'] -= diff" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Main Loop" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "code_folding": [ 0 ], "collapsed": false }, "outputs": [], "source": [ "def loopCondition(G, s, t):\n", " # ここではO(n)の時間をかけてcheckしているが、データ構造を工夫するとO(1)の時間でcheckすることが可能らしい\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" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "code_folding": [ 0 ], "collapsed": true }, "outputs": [], "source": [ "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": "markdown", "metadata": {}, "source": [ "*PushRelabel* が動くかどうか試してみる" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "code_folding": [ 0 ], "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAFkCAYAAAC9wjgoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X18zfX/x/HH2Q7mOtcqiVmbWa5CSJSLFC19i3yVKMpV\nIkQ3iUq2r8IqrEzkS8hXvvrmJ0R8+UbIdS42m7GURCIXE7M5n98fb8eMXeFsZ9vneb/ddrN9Pp/z\nOa/V2ec8z/vzvnBYlmUhIiIituXj7QJERETEuxQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZE\nRERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGREREbE5h\nQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTm\nFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGRERE\nbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBE\nRMTmFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQG\nREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERszuntAkQkf0hMTCQ+Pp6kpCSKFClCQEAAJUqU\n8HZZIuIBCgMikqHo6GiioqL4dulSYg8cwLKsy/scDgdB/v481L49ffv2pVatWl6sVERuhsO68q9b\nRARISEjgpT59+Obbb6nodNIxJYVGQC2gGPAXEA1sBhY6nfyeksIjDz3Ex1OnUr16dW+WLiI3QGFA\nRNKYPn06gwYMoHxKCv9ISaETUDiT4y8A/wZedzo57nTy4eTJvPjii7lTrIh4hDoQishl4eHh9OrV\ni6fPn2dXSgrPkHkQ4NL+Z4DdKSk8ff48vXr1Ijw8POeLFRGPUcuAiACmRaBXr16MAUbexHnGAG9e\nOt8LL7zgmeJEJEcpDIgICQkJ1K5Vi6fPn2faTZ7LAnoD8/z82BUdrT4EIvmAwoCI0K5tW2JWr2ZX\nSgolPXC+00Btp5NaLVuybMUKD5xRRHKSwoCIzUVHRxMSEsJczL1/T/kc6Hrp/MHBwR48s4h4mjoQ\n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\nerMbdAQqOp1MmTLF47WLiGcpDIjYWOHChTl+5Ah/Bwpfsd0BNMMEALe1wBOX9q2/tG0HcBq4P51z\nF43rJWAAAARjSURBVAE6pqSwctkyj9ctIp6lMCBiY2fOnCH2wAEapbOvOebWwLlLP68D2gN1SQ0J\n7taC9MIAmFsKe/fvJzExMYMjRCQvUBgQsbH9+/djWRa10tnXHEjG3AaIA45d2taC1DCwDjMr4S0Z\nnD8EM7QxPj7eo3WLiGcpDIjYWFJSEmCmGL5aQ8AP029gLVARCMAEgk3AhUvbm2dy/qJXPY+I5E1O\nbxcgIt5TpEgRwKw1cLVCwL2YMFCV1Df95kASMBc4imkpyIj7FoP7eUQkb1LLgIiNBQQE4HA4yGjN\nwebAD8AaUsNAOaAm8B6mM2FmLQN7MAsiBQQEeKZgEckRCgMiNlaiRAmC/P3ZnMH+5phP97+Q9k2/\nBaYfQTXgtkzOvwWoWaMGJUqU8EC1IpJTFAZEbO6h9u1Z6HRyIZ199wG+mEmE6l6xvTmmVSCzWwRJ\nmOWN27Rr57FaRSRnaG0CEZuLjo4mJCSEucAzHjzv50DXS+fXSoUieZvCgIjQrm1bYlavZldKynUt\nW5yR00Btp5NaLVuybMUKD5xRRHKSwoCIkJCQQO1atXj6/Hmm3eS5LKA3MM/Pj13R0VSvXt0DFYpI\nTlKfARGhevXqfDh5MtOBsJs4j3Xp8dOBiZGRCgIi+YTmGRARAF588UWOHj3KyJEjOYhZhvh6bhmc\nBl7FBIHw8HBeeOGFnChTRHKAbhOISBrTp09n0IABlEtJYWxKCp1Iu4jR1ZKAhcDrTifHnU4mRkYq\nCIjkMwoDInKNhIQEXurTh2++/ZaKTicdU1JoiFlroChm7oE9mHkEFjqd/J6SwiMPPcTHU6fq1oBI\nPqQwICIZio6OJioqipXLlrH30qJGbg6Hg5o1atCmXTv69eun4YMi+ZjCgIhkS2JiIvHx8SQlJVGk\nSBECAgI0s6BIAaEwICIiYnMaWigiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjan\nMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJi\ncwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIi\nIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAg\nIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMK\nAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2\npzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIi\nYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjb3/8JdT1NDbuw8\nAAAAAElFTkSuQmCC\n", "text/plain": [ "<matplotlib.figure.Figure at 0x104723e48>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# もろもろをインポート\n", "import networkx as nx\n", "import matplotlib.pyplot as plt\n", "from collections import deque\n", "\n", "# Lecture1の例のグラフGを生成\n", "G = nx.DiGraph()\n", "G.add_edges_from([('s','v',{'capacity': 3}),('s','w',{'capacity': 2}),('v','w',{'capacity': 5}),('v','t',{'capacity': 2}),('w','t',{'capacity': 3})])\n", "for e in G.edges():\n", " G[e[0]][e[1]]['flow'] = 0\n", "\n", "# 描画\n", "\n", "pos={'s':(0,2),'v':(3,4),'w':(3,0),'t':(6,2)}\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": 26, "metadata": { "collapsed": false }, "outputs": [], "source": [ "H = PushRelabel(G, 's', 't')" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "code_folding": [], "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAFkCAYAAAC9wjgoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X98z/X+//Hbe3tj8iu/1ZGitZnlN0mLqFG0lEgOUZRf\niRB9HFGJHYUl2WHy40uUI0fnOEJ+HU6E8jM/NltjKYkcCsNmP17fP57eNtovvPd+b3vdr5fL+8Je\nr9f79X6s3l7v+/v1/OWwLMtCREREbMvH2wWIiIiIdykMiIiI2JzCgIiIiM0pDIiIiNicwoCIiIjN\nKQyIiIjYnMKAiIiIzSkMiIiI2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyIiIjYnMKAiIiIzSkMiIiI\n2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyIiIjYnMKAiIiIzSkMiIiI2JzCgIiIiM0pDIiIiNicwoCI\niIjNKQyIiIjYnMKAiIiIzSkMiIiI2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyIiIjYnMKAiIiIzSkM\niIiI2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyIiIjYnMKAiIiIzSkMiIiI2JzCgIiIiM0pDIiIiNic\nwoCIiIjNKQyIiIjYnMKAiIiIzSkMiIiI2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyIiIjYnMKAiIiI\nzSkMiIiI2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyIiIjYnNPbBYhI4ZCYmEh8fDzJycmUKFECf39/\nSpcu7e2yRMQNFAZEJFvR0dFERUWxduVKYg8fxrKsK/scDgeBtWrRpn17+vfvT506dbxYqYjcDIeV\n+V+3iAiQkJDAy/368eXatVRxOumUmkpToA5wC3ABiAa2A0udTn5NTeWxNm2YPnMmNWvW9GbpInID\nFAZE5CqzZ89myKBBVEpN5a+pqXQGiudw/CXgH8BfnE5OOZ18MG0aL730kmeKFRG3UAdCEbkiPDyc\nPn368OekJPalptKNnIMAl/d3A/anpvLnpCT69OlDeHh4/hcrIm6jOwMiApg7An369GEcMPomzjMO\nePPy+V588UX3FCci+UphQERISEigbp06/DkpiVk3eS4L6Ass8vNjX3S0+hCIFAIKAyJCu7Ztidmw\ngX2pqZRxw/nOAnWdTuq0bs2qNWvccEYRyU8KAyI2Fx0dTXBwMJ9g2v7d5VOg++XzBwUFufHMIuJu\n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\nzp0j9vBhmmaxrwWmaeDi5Z83A+2B+mSEBNfdgqzCAJgmhYOHDpGYmJjNESJSECgMiNjYoUOHsCyL\nOgNfQiMAAAQXSURBVFnsawGkYJoB4oCTl7e1JCMMbMbMSnhrNucPxgxtjI+Pd2vdIuJeCgMiNpac\nnAyYKYav1QTww/Qb2ARUAfwxgeBb4NLl7S1yOH/Ja15HRAomp7cLEBHvKVGiBGDWGrhWMeA+TBio\nQcaHfgsgGfgEOIG5U5AdVxOD63VEpGDSnQERG/P398fhcJDdmoMtgG+AjWSEgYpAbeA9TGfCnO4M\nHMAsiOTv7++egkUkXygMiNhY6dKlCaxVi+3Z7G+B+Xb/E1d/6LfE9CO4C7g9h/PvAGrffTelS5d2\nQ7Uikl8UBkRsrk379ix1OrmUxb4HAF/MJEL1M21vgbkrkFMTQTJmeePQdu3cVquI5A+tTSBic9HR\n0QQHB/MJ0M2N5/0U6H75/FqpUKRgUxgQEdq1bUvMhg3sS029rmWLs3MWqOt0Uqd1a1atWeOGM4pI\nflIYEBESEhKoW6cOf05KYtZNnssC+gKL/PzYFx1NzZo13VChiOQn9RkQEWrWrMkH06YxGxh/E+ex\nLj9/NjA1MlJBQKSQ0DwDIgLASy+9xIkTJxg9ejRHMMsQX0+TwVngNUwQCA8P58UXX8yPMkUkH6iZ\nQESuMnv2bIYMGkTF1FQmpKbSmasXMbpWMrAU+IvTySmnk6mRkQoCIoWMwoCI/EFCQgIv9+vHl2vX\nUsXppFNqKk0waw2UxMw9cAAzj8BSp5NfU1N5rE0bps+cqaYBkUJIYUBEshUdHU1UVBTrVq3i4OVF\njVwcDge1776b0HbtGDBggIYPihRiCgMikieJiYnEx8eTnJxMiRIl8Pf318yCIkWEwoCIiIjNaWih\niIiIzSkMiIiI2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyIiIjYnMKAiIiIzSkMiIiI2JzCgIiIiM0p\nDIiIiNicwoCIiIjNKQyIiIjYnMKAiIiIzSkMiIiI2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyIiIjY\nnMKAiIiIzSkMiIiI2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyIiIjYnMKAiIiIzSkMiIiI2JzCgIiI\niM0pDIiIiNicwoCIiIjNKQyIiIjYnMKAiIiIzSkMiIiI2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyI\niIjYnMKAiIiIzSkMiIiI2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyIiIjYnMKAiIiIzSkMiIiI2JzC\ngIiIiM0pDIiIiNicwoCIiIjNKQyIiIjYnMKAiIiIzSkMiIiI2JzCgIiIiM0pDIiIiNicwoCIiIjN\nKQyIiIjYnMKAiIiIzSkMiIiI2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyIiIjYnMKAiIiIzSkMiIiI\n2JzCgIiIiM0pDIiIiNicwoCIiIjNKQyIiIjY3P8HURNxpGpu+9sAAAAASUVORK5CYII=\n", "text/plain": [ "<matplotlib.figure.Figure at 0x10ef963c8>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 描画(flowがどう変わったか)\n", "# heightも表示したいけどやり方がわからず\n", "\n", "pos={'s':(0,2),'v':(3,4),'w':(3,0),'t':(6,2)}\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": "markdown", "metadata": {}, "source": [ "# Questions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "もとのグラフに長さ2のループがあった場合、residual graphはmultiple edgeを持つはず。\n", "\n", "しかし、[networkXの有向グラフ](https://networkx.readthedocs.io/en/stable/reference/classes.digraph.html)はmultiple edgeをサポートしていない。この場合、テキストにあるようなmultiple edgesを持つようなresidual graphは作れない(residual graphを作るときに*flow, capacity*の変数名を変えればいいかもしれないが、とてもめんどくさそう。)\n", "\n", "長さ2のループがある場合、いまのような*makeResidual*でも、maximum flow関連のアルゴリズムはキチンと動くのか?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Summary" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "最後に、今回作った関数をまとめておく。" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "code_folding": [ 4, 24, 64, 92, 102 ], "collapsed": true }, "outputs": [], "source": [ "# ch03で作成したものたち\n", "# makeResidualは前回作ったものだが、PushRelabelに必要\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", " augment the flow of (v,w)\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", " # (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", " 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", "\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": "markdown", "metadata": {}, "source": [ "例のグラフを作るのと、描画するのも便利なので、再掲しておく。" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "code_folding": [ 0 ], "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAFkCAYAAAC9wjgoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X18zfX/x/HH2Q7mOtcqiVmbWa5CSJSLFC19i3yVKMpV\nIkQ3iUq2r8IqrEzkS8hXvvrmJ0R8+UbIdS42m7GURCIXE7M5n98fb8eMXeFsZ9vneb/ddrN9Pp/z\nOa/V2ec8z/vzvnBYlmUhIiIituXj7QJERETEuxQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZE\nRERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGREREbE5h\nQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTm\nFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGRERE\nbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBE\nRMTmFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQG\nREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERszuntAkQkf0hMTCQ+Pp6kpCSKFClCQEAAJUqU\n8HZZIuIBCgMikqHo6GiioqL4dulSYg8cwLKsy/scDgdB/v481L49ffv2pVatWl6sVERuhsO68q9b\nRARISEjgpT59+Obbb6nodNIxJYVGQC2gGPAXEA1sBhY6nfyeksIjDz3Ex1OnUr16dW+WLiI3QGFA\nRNKYPn06gwYMoHxKCv9ISaETUDiT4y8A/wZedzo57nTy4eTJvPjii7lTrIh4hDoQishl4eHh9OrV\ni6fPn2dXSgrPkHkQ4NL+Z4DdKSk8ff48vXr1Ijw8POeLFRGPUcuAiACmRaBXr16MAUbexHnGAG9e\nOt8LL7zgmeJEJEcpDIgICQkJ1K5Vi6fPn2faTZ7LAnoD8/z82BUdrT4EIvmAwoCI0K5tW2JWr2ZX\nSgolPXC+00Btp5NaLVuybMUKD5xRRHKSwoCIzUVHRxMSEsJczL1/T/kc6Hrp/MHBwR48s4h4mjoQ\n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\nerMbdAQqOp1MmTLF47WLiGcpDIjYWOHChTl+5Ah/Bwpfsd0BNMMEALe1wBOX9q2/tG0HcBq4P51z\nF43rJWAAAARjSURBVAE6pqSwctkyj9ctIp6lMCBiY2fOnCH2wAEapbOvOebWwLlLP68D2gN1SQ0J\n7taC9MIAmFsKe/fvJzExMYMjRCQvUBgQsbH9+/djWRa10tnXHEjG3AaIA45d2taC1DCwDjMr4S0Z\nnD8EM7QxPj7eo3WLiGcpDIjYWFJSEmCmGL5aQ8AP029gLVARCMAEgk3AhUvbm2dy/qJXPY+I5E1O\nbxcgIt5TpEgRwKw1cLVCwL2YMFCV1Df95kASMBc4imkpyIj7FoP7eUQkb1LLgIiNBQQE4HA4yGjN\nwebAD8AaUsNAOaAm8B6mM2FmLQN7MAsiBQQEeKZgEckRCgMiNlaiRAmC/P3ZnMH+5phP97+Q9k2/\nBaYfQTXgtkzOvwWoWaMGJUqU8EC1IpJTFAZEbO6h9u1Z6HRyIZ199wG+mEmE6l6xvTmmVSCzWwRJ\nmOWN27Rr57FaRSRnaG0CEZuLjo4mJCSEucAzHjzv50DXS+fXSoUieZvCgIjQrm1bYlavZldKynUt\nW5yR00Btp5NaLVuybMUKD5xRRHKSwoCIkJCQQO1atXj6/Hmm3eS5LKA3MM/Pj13R0VSvXt0DFYpI\nTlKfARGhevXqfDh5MtOBsJs4j3Xp8dOBiZGRCgIi+YTmGRARAF588UWOHj3KyJEjOYhZhvh6bhmc\nBl7FBIHw8HBeeOGFnChTRHKAbhOISBrTp09n0IABlEtJYWxKCp1Iu4jR1ZKAhcDrTifHnU4mRkYq\nCIjkMwoDInKNhIQEXurTh2++/ZaKTicdU1JoiFlroChm7oE9mHkEFjqd/J6SwiMPPcTHU6fq1oBI\nPqQwICIZio6OJioqipXLlrH30qJGbg6Hg5o1atCmXTv69eun4YMi+ZjCgIhkS2JiIvHx8SQlJVGk\nSBECAgI0s6BIAaEwICIiYnMaWigiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjan\nMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJi\ncwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIi\nIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAg\nIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMK\nAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2\npzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIi\nYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjb3/8JdT1NDbuw8\nAAAAAElFTkSuQmCC\n", "text/plain": [ "<matplotlib.figure.Figure at 0x1100aafd0>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 例のグラフを作成\n", "\n", "# もろもろをインポート\n", "import networkx as nx\n", "import matplotlib.pyplot as plt\n", "from collections import deque\n", "\n", "# Lecture1の例のグラフGを生成\n", "G = nx.DiGraph()\n", "G.add_edges_from([('s','v',{'capacity': 3}),('s','w',{'capacity': 2}),('v','w',{'capacity': 5}),('v','t',{'capacity': 2}),('w','t',{'capacity': 3})])\n", "for e in G.edges():\n", " G[e[0]][e[1]]['flow'] = 0\n", "\n", "# 描画\n", "\n", "pos={'s':(0,2),'v':(3,4),'w':(3,0),'t':(6,2)}\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": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAFkCAYAAAC9wjgoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X18zfX/x/HH2Q7mOtcqiVmbWa5CSJSLFC19i3yVKMpV\nIkQ3iUq2r8IqrEzkS8hXvvrmJ0R8+UbIdS42m7GURCIXE7M5n98fb8eMXeFsZ9vneb/ddrN9Pp/z\nOa/V2ec8z/vzvnBYlmUhIiIituXj7QJERETEuxQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZE\nRERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGREREbE5h\nQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTm\nFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGRERE\nbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBE\nRMTmFAZERERsTmFARETE5hQGREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERsTmFARETE5hQG\nREREbE5hQERExOYUBkRERGxOYUBERMTmFAZERERszuntAkQkf0hMTCQ+Pp6kpCSKFClCQEAAJUqU\n8HZZIuIBCgMikqHo6GiioqL4dulSYg8cwLKsy/scDgdB/v481L49ffv2pVatWl6sVERuhsO68q9b\nRARISEjgpT59+Obbb6nodNIxJYVGQC2gGPAXEA1sBhY6nfyeksIjDz3Ex1OnUr16dW+WLiI3QGFA\nRNKYPn06gwYMoHxKCv9ISaETUDiT4y8A/wZedzo57nTy4eTJvPjii7lTrIh4hDoQishl4eHh9OrV\ni6fPn2dXSgrPkHkQ4NL+Z4DdKSk8ff48vXr1Ijw8POeLFRGPUcuAiACmRaBXr16MAUbexHnGAG9e\nOt8LL7zgmeJEJEcpDIgICQkJ1K5Vi6fPn2faTZ7LAnoD8/z82BUdrT4EIvmAwoCI0K5tW2JWr2ZX\nSgolPXC+00Btp5NaLVuybMUKD5xRRHKSwoCIzUVHRxMSEsJczL1/T/kc6Hrp/MHBwR48s4h4mjoQ\n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\nerMbdAQqOp1MmTLF47WLiGcpDIjYWOHChTl+5Ah/Bwpfsd0BNMMEALe1wBOX9q2/tG0HcBq4P51z\nF43rJWAAAARjSURBVAE6pqSwctkyj9ctIp6lMCBiY2fOnCH2wAEapbOvOebWwLlLP68D2gN1SQ0J\n7taC9MIAmFsKe/fvJzExMYMjRCQvUBgQsbH9+/djWRa10tnXHEjG3AaIA45d2taC1DCwDjMr4S0Z\nnD8EM7QxPj7eo3WLiGcpDIjYWFJSEmCmGL5aQ8AP029gLVARCMAEgk3AhUvbm2dy/qJXPY+I5E1O\nbxcgIt5TpEgRwKw1cLVCwL2YMFCV1Df95kASMBc4imkpyIj7FoP7eUQkb1LLgIiNBQQE4HA4yGjN\nwebAD8AaUsNAOaAm8B6mM2FmLQN7MAsiBQQEeKZgEckRCgMiNlaiRAmC/P3ZnMH+5phP97+Q9k2/\nBaYfQTXgtkzOvwWoWaMGJUqU8EC1IpJTFAZEbO6h9u1Z6HRyIZ199wG+mEmE6l6xvTmmVSCzWwRJ\nmOWN27Rr57FaRSRnaG0CEZuLjo4mJCSEucAzHjzv50DXS+fXSoUieZvCgIjQrm1bYlavZldKynUt\nW5yR00Btp5NaLVuybMUKD5xRRHKSwoCIkJCQQO1atXj6/Hmm3eS5LKA3MM/Pj13R0VSvXt0DFYpI\nTlKfARGhevXqfDh5MtOBsJs4j3Xp8dOBiZGRCgIi+YTmGRARAF588UWOHj3KyJEjOYhZhvh6bhmc\nBl7FBIHw8HBeeOGFnChTRHKAbhOISBrTp09n0IABlEtJYWxKCp1Iu4jR1ZKAhcDrTifHnU4mRkYq\nCIjkMwoDInKNhIQEXurTh2++/ZaKTicdU1JoiFlroChm7oE9mHkEFjqd/J6SwiMPPcTHU6fq1oBI\nPqQwICIZio6OJioqipXLlrH30qJGbg6Hg5o1atCmXTv69eun4YMi+ZjCgIhkS2JiIvHx8SQlJVGk\nSBECAgI0s6BIAaEwICIiYnMaWigiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjan\nMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJi\ncwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIi\nIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAg\nIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMK\nAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2\npzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIi\nYnMKAyIiIjanMCAiImJzCgMiIiI2pzAgIiJicwoDIiIiNqcwICIiYnMKAyIiIjb3/8JdT1NDbuw8\nAAAAAElFTkSuQmCC\n", "text/plain": [ "<matplotlib.figure.Figure at 0x1104f2908>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 描画(flowがどう変わったか)\n", "# heightも表示したいけどやり方がわからず\n", "\n", "pos={'s':(0,2),'v':(3,4),'w':(3,0),'t':(6,2)}\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()" ] } ], "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": "30px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": true, "toc_number_sections": true, "toc_section_display": "block", "toc_threshold": 6, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }