Python/algorithms/Graph.ipynb

824 lines
352 KiB
Plaintext
Raw Normal View History

2024-06-21 06:30:38 +00:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "c9531bac",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>.container{width:100%}</style>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%HTML\n",
"<style>.container{width:100%}</style>"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "25138dfd",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import networkx as nx"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "1a17a18b",
2024-11-20 17:22:43 +00:00
"metadata": {},
2024-06-21 06:30:38 +00:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGZCAYAAAAUzjLvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABK+ElEQVR4nO3deViU5f4G8PudGfZlgEFcQUUWDbHFNRMN18qioy1qLunRssUWy07m8bhVmuXRrDQ7/kxzJSspWzWUlNIIj0cjVAQRBjUFBmWZYZuZ9/cHQZLMMMDsc3+ui+sK3u07EvPe8zzP+zyCKIoiiIiIyGVJbF0AERER2RbDABERkYtjGCAiInJxDANEREQujmGAiIjIxTEMEBERuTiGASIiIhfHMEBEROTiGAaIiIhcHMMAUQtt2bIFgiA0fHl6eqJDhw6Ij4/HihUrUFhYaOsSW23nzp14++23bV2GSXJzczF+/HgEBATA19cXo0aNwvHjx21dFpFDYhggaqXNmzfj6NGj+P7777Fu3TrccsstWLlyJXr16oXk5GRbl9cqjhIGioqKEBcXh7Nnz+LDDz/E7t27UVVVhTvvvBNZWVm2Lo/I4chsXQCRo+rduzf69evX8P0DDzyAuXPnYsiQIRg/fjyys7PRvn17G1ZoWTqdDlqtFh4eHla/9ltvvYWioiIcOXIEXbt2BQAMGTIEPXr0wKJFi/Dxxx9bvSYiR8aWASIzCgsLw7///W+Ul5fjgw8+aLTt2LFjSEhIQFBQEDw9PXHrrbdi9+7djfap74I4ePAgHnvsMSgUCvj7+2PatGlQq9W4fPkyHn74YQQEBKBjx46YN28eamtrG52jpKQETz31FDp37gx3d3eEh4fjn//8J6qrq43Wfuedd+Lrr79Gfn5+o24QAMjLy4MgCHjzzTfx2muvoXv37vDw8EBKSorJrw0ALl++jNmzZ6NLly5wd3dH9+7dsXTpUmi12hb9OyclJWH48OENQQAA/P39MX78eHz55ZctPh+Rq2PLAJGZ3XPPPZBKpTh8+HDDz1JSUnDXXXdh4MCB2LBhA+RyORITEzFhwgRoNBpMnz690TlmzZqF8ePHIzExEf/73/+wYMECaLVaZGVlYfz48Xj88ceRnJyMlStXolOnTnjhhRcAAFVVVYiPj8e5c+ewdOlS9OnTB6mpqVixYgVOnDiBr7/+2mDd69evx+OPP45z584hKSmpyX3eeecdREVFYdWqVfD390dkZKTJr+3y5csYMGAAJBIJFi1ahB49euDo0aN47bXXkJeXh82bN5v071tZWYlz585h3LhxN2zr06cPKisrkZubi6ioKJPOR0QARCJqkc2bN4sAxPT0dIP7tG/fXuzVq1fD9z179hRvvfVWsba2ttF+9957r9ixY0dRp9M1OvczzzzTaL+//e1vIgBx9erVjX5+yy23iLfddlvD9xs2bBABiLt3726038qVK0UA4v79+42+trFjx4pdu3a94efnz58XAYg9evQQa2pqGm0z9bXNnj1b9PX1FfPz8xvtt2rVKhGAmJmZabS2ehcvXhQBiCtWrLhh286dO0UA4pEjR0w6FxHVYTcBkQWIotjw3zk5OThz5gwmT54MANBqtQ1f99xzD37//fcbBr3de++9jb7v1asXAGDs2LE3/Dw/P7/h+4MHD8LHxwcPPvhgo/3qP50fOHCgTa8rISEBbm5urXptX331FeLj49GpU6dG+919990AgEOHDrWolvoujJZuI6IbsZuAyMzUajVUKhViY2MBAFeuXAEAzJs3D/PmzWvymOLi4kbfBwUFNfre3d3d4M+rqqoavlepVOjQocMNN8OQkBDIZDKoVKpWvKI/dezYsdH3LXltV65cwZdfftkoTDS1X3MCAwMhCEKTr6WkpATAjf9ORGQcwwCRmX399dfQ6XS48847AQDBwcEAgFdeeQXjx49v8pjo6GizXFuhUCAtLQ2iKDYKBIWFhdBqtQ21tNZfQ0ZLXltwcDD69OmD119/vcn9OnXqZFINXl5eiIiIQEZGxg3bMjIy4OXlhfDwcJPORUR1GAaIzEipVGLevHmQy+WYPXs2gLqbYWRkJE6ePInly5db9PojRozA7t278fnnnzcaYLd169aG7cZ4eHigsrLS5Ou15LXde++9+Oabb9CjRw8EBgaafI2mjBs3Dm+//TYKCgoQGhoKACgvL8eePXuQkJAAmYxvbUQtwb8Yolb67bffGvq9CwsLkZqais2bN0MqlSIpKQnt2rVr2PeDDz7A3XffjTFjxmD69Ono3LkzSkpKcPr0aRw/fhyffPKJWWqaNm0a1q1bh0cffRR5eXmIjY3Fjz/+iOXLl+Oee+7ByJEjjR4fGxuLPXv24P3330ffvn0hkUgazaXQFFNf27Jly/D9999j8ODBePbZZxEdHY2qqirk5eXhm2++wYYNG9ClSxeTXue8efOwbds2jB07FsuWLYOHhwfeeOMNVFVVYcmSJSadg4j+xDBA1EozZswAUNdvHxAQgF69euHll1/GrFmzGgUBAIiPj8cvv/yC119/Hc8//zyuXr0KhUKBm266CQ8//LDZavL09ERKSgr++c9/NkzM07lzZ8ybNw+LFy9u9vjnnnsOmZmZWLBgAUpLSyGKYqPBkE0x9bV17NgRx44dw6uvvoq33noLFy5cgJ+fH7p374677rqrRa0F7dq1Q2pqKubNm4dHH30UWq0Wt99+O3744Qf07NnT5PMQUR1BbO4vnYiIiJwaHy0kIiJycewmICK7odPpjHZLCIIAqVRqxYqIXANbBojIbowYMQJubm4Gv3r06GHrEomcEscMEJHdyMrKQnl5ucHtHh4eDZM5EZH5MAwQERG5OJPGDOj1ely6dAl+fn6c85uIiMhBiKKI8vJydOrUCRKJ4ZEBJoWBS5cuNczyRURERI6loKDA6KReJoUBPz+/hpP5+/ubpzIiIiKyqLKyMoSGhjbcxw0xKQzUdw34+/szDBARETmY5rr4+WghERGRi2MYICIicnEMA0RERC6OYYCIiMjFMQwQERG5OIYBIiIiF8cwQERE5OIYBoiIiFwcwwAREZGLYxggIiJycQwDRERELo5hgIiIyMUxDBAREbk4hgEiIiIXxzBARETk4hgGiIiIXJzM1gUQEZH9U1drkadSo0arh7tMgm4KH/h48BbiLPibJCKiJmVfKceONCVSsgqhLNFAvG6bACAsyBvx0SGYPDAMke39bFUmmYEgiqLY3E5lZWWQy+UoLS2Fv7+/NeoiIiIbKSjRYEFSBlJziiGVCNDpDd8m6rfHRQRj+bhYhAZ5W7FSao6p92+OGSAiogaJ6UqMXHMIR3JVAGA0CFy//UiuCiPXHEJiutLiNZL5sZuAiIgAAO+lZGPV/rOtOlanF6HTi5i/JwPFFdWYEx9p5urIktgyQERESExXtjoI/NWq/WfxMVsIHArDABGRiyso0WDx3kyznnPR3kwUlGjMek6yHHYTEBG5uAVJGdAaGRtQVZCJ0qO7UXPxDERdLaR+Cvj0Ho6AOyYZPEarF7EgKQPbZg60RMlkZgwDREQuLPtKOVJzig1uV2f+gOKvVsO75xAo7n0BEncv1F77HbryEqPn1elFpOYUI6ewHBEhfOzQ3jEMEBG5sB1pSoOPD2rLi6H67j343nIXFGOeavi5Z9c+Jp1bKhGw/WclliTEmK1esgyOGSAicmEpWYUGHx+sOLkfYm0V5IMebNW5dXoRKWcL21IeWQlbBoiIXFRFtRZKI4P8qgt+g8TTD7WqAhR+9ipqi/Ih8fKDd9TtCIz/OyQezU8wpFRpoK7WcupiO8eWASIiF5WvUsPYlELa8hKI2moUff4GfHrFof3E1+A/cDzUv6Wg8JMlMGECW4gA8lRqs9VMlsGoRkTkomq0euM7iHqI2hoEDHsU8tsfAlA3XkCQyHD1wEZU5Z+EV7db2n4dsjm2DBARuSh3mfFbgMSr7ikAr+63Nfq5V49+AICayzlmuQ7ZHn9DREQuqpvCB4KR7e4h3ZveUN89IDR/CxH+uA7ZN4YBIiIX5eMhQ5iRVQa9owcDACp
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgQAAAGZCAYAAAD2EimWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABIR0lEQVR4nO3deViU5f4/8PczMzDsKOCAKLggqF/CJSFNc6FsNwpPuaSW6anM45LlMaN+uVRaqWlqppVpqaXWcTuluUXmFqFHDTmJoLEcUZZBdhiYmef3B0KizAwDM/MMw/t1XV7nMM/2GVLmzf3c9+cRRFEUQURERK2aTOoCiIiISHoMBERERMRAQERERAwEREREBAYCIiIiAgMBERERgYGAiIiIwEBAREREYCAgIiIiMBAQmW3jxo0QBKHuj4uLCwICAhAdHY3FixcjNzdX6hKb7Ouvv8aKFSukLsOk5ORkTJ06FXfffTfc3d0hCAJ+/vlnqcsiatEYCIiaaMOGDTh58iQOHjyIjz/+GH369MH777+Pnj174tChQ1KX1yQtJRCcOnUKu3btgo+PD+677z6pyyFyCAwERE10xx13YMCAARg8eDD+9re/Yfny5fj999/h7u6OkSNHIicnR+oSrUqn00Gj0Uhy7QkTJiA7Oxs//PADnnnmGUlqIHI0DAREFhQcHIxly5ahpKQE69atq7ft1KlTiImJgY+PD1xcXNC3b19s37693j61tyN++uknPP/88/D19YWXlxeeeeYZlJWV4dq1axg1ahTatGmD9u3bY/bs2aiurq53joKCAkydOhUdOnSAs7MzunbtijfeeMPkh/ewYcPwww8/ICMjo94tEQBIT0+HIAj44IMP8M4776BLly5QKpWIj49v9HsDgGvXruHFF19Ex44d4ezsjC5dumDBggXQarVmfZ9lMv7oIrI0hdQFEDmaRx55BHK5HL/88kvda/Hx8XjooYfQv39/rF27Ft7e3ti6dStGjx6N8vJyTJw4sd45/v73v2PkyJHYunUrzpw5g7i4OGi1WqSkpGDkyJF44YUXcOjQIbz//vsIDAzEK6+8AgCorKxEdHQ0Ll26hAULFqBXr144evQoFi9ejLNnz+KHH34wWPeaNWvwwgsv4NKlS9i5c2eD+6xcuRJhYWFYunQpvLy8EBoa2uj3du3aNdx1112QyWR46623EBISgpMnT+Kdd95Beno6NmzY0LxvPBE1j0hEZtmwYYMIQExMTDS4j7+/v9izZ8+6r3v06CH27dtXrK6urrffiBEjxPbt24s6na7euadPn15vvyeeeEIEIH744Yf1Xu/Tp49455131n29du1aEYC4ffv2evu9//77IgDxwIEDRt/bo48+Knbq1Om21//8808RgBgSEiJWVVXV29bY9/biiy+KHh4eYkZGRr39li5dKgIQk5OTjdZmyLfffisCEOPj45t0PBHV4LgbkRWIolj3/9PS0nDhwgWMGzcOAKDVauv+PPLII7h69SpSUlLqHT9ixIh6X/fs2RMA8Oijj972ekZGRt3XP/30E9zd3fHkk0/W26/2t/TDhw83633FxMTAycmpSe/t+++/R3R0NAIDA+vt9/DDDwMAjhw50qzaiKh5eMuAyMLKysqgVqsREREBAHWTC2fPno3Zs2c3eEx+fn69r318fOp97ezsbPD1ysrKuq/VajUCAgLq7v3XUqlUUCgUUKvVTXhHf2nfvn29r815bzk5Ofj3v/9dL1A0tB8RSYOBgMjCfvjhB+h0OgwbNgwA4OfnBwB4/fXXMXLkyAaP6d69u0Wu7evri4SEBIiiWC8U5ObmQqvV1tXSVLcGDXPem5+fH3r16oV33323wf0CAwObVRsRNQ8DAZEFZWZmYvbs2fD29saLL74IoOYDMTQ0FOfOncOiRYusev377rsP27dvx65duxAbG1v3+ldffVW33RilUomKiopGX8+c9zZixAjs3bsXISEhaNu2baOvQUS2wUBA1ETnz5+vuw+em5uLo0ePYsOGDZDL5di5cyfatWtXt++6devw8MMP48EHH8TEiRPRoUMHFBQU4I8//sB//vMffPvttxap6ZlnnsHHH3+MZ599Funp6YiIiMCxY8ewaNEiPPLIIxg+fLjR4yMiIrBjxw588skn6NevH2QyGSIjI40e09j3tnDhQhw8eBADBw7EjBkz0L17d1RWViI9PR179+7F2rVr0bFjx0a9z/LycuzduxcA8OuvvwKomYOQn58Pd3f3unkJRGQGqWc1ErU0tSsBav84OzuLKpVKHDp0qLho0SIxNze3wePOnTsnjho1SlSpVKKTk5MYEBAg3nvvveLatWtvO/etKxjmzZsnAhDz8vLqvf7ss8+K7u7u9V5Tq9XilClTxPbt24sKhULs1KmT+Prrr4uVlZUm31tBQYH45JNPim3atBEFQRBrf0TUrjJYsmRJk9+bKIpiXl6eOGPGDLFLly6ik5OT6OPjI/br10984403xNLSUpP11aqtp6E/Da2SICLTBFG8aTo0ERERtUpcdkhEREScQ0BE9kOn08HYoKUgCJDL5TasiKj14AgBEdmN++67D05OTgb/hISESF0ikcPiHAIishspKSkoKSkxuF2pVNY1fCIiy2IgICIiosbNIdDr9cjOzoanp+dtncqIiIjIPomiiJKSEgQGBpp8bHijAkF2djaCgoIsUhwRERHZVlZWlsnGX40KBJ6ennUn9PLyan5lREREZHXFxcUICgqq+xw3plGBoPY2gZeXFwMBERFRC9OY2/1cdkhEREQMBERERMRAQERERGAgICIiIjAQEBERERgIiIiICAwEREREBAYCIiIiAgMBERERgYGAiIiIwEBAREREYCAgIiIiMBAQERERGAiIiIgIDAREREQEBgIiIiICoJC6ACIiosYo02iRri5DlVYPZ4UMnX3d4a7kx5il8DtJRER2KzWnBFsSMhGfkovMgnKIN20TAAT7uCG6uwrj+gcj1N9TqjIdgiCKomhqp+LiYnh7e6OoqAheXl62qIuIiFqxrIJyxO1MwtG0fMhlAnR6wx9VtdsHd/PDotgIBPm42bBS+2bO5zfnEBARkV3ZmpiJ4cuP4MRlNQAYDQM3bz9xWY3hy49ga2Km1Wt0RLxlQEREdmN1fCqWHrjYpGN1ehE6vYi5O5KQX6rBtOhQC1fn2DhCQEREdmFrYmaTw8Ctlh64iG0cKTALAwEREUkuq6Ac8/YkW/Scb+1JRlZBuUXP6ch4y4CIiCQXtzMJWiNzBTTZKSg8uhmaKxcAUYRz+1C0GTIBLh3/z+AxWr2IuJ1J2DS5vzVKdjgcISAiIkml5pTgaFq+wcmDmqsXcW3LXIjVVfAb8Qr8RrwCUVuFnG/egObKHwbPq9OLOJqWj7TcEmuV7lAYCIiISFJbEjIhlwkGtxf+shkyF3eoRi+AW9jdcOs+EP6j34bM2RXXf/rC6LnlMgGbf+VcgsZgICAiIknFp+QaXVqoufIHXIIjIHNyqXtNpnSDS9Ad0Fz5A9rSAoPH6vQi4i/mWrReR8VAQEREkinVaJFpYuKfqKuGIHe6fYOi5rXqvHSjx2eqy1Gm0Ta1xFaDgYCIiCSToS6DqXa5Tr7B0GSnQBT1da+Jeh2qslMAAPoK43MERADp6rJmVur4GAiIiEgyVVq9yX28+o2AtuAKCg6shbYkH9riPBT8+DG0RTduBQiG5x+Yc53WjssOiYhIMs4K07+XevR+ALqKYhSd2IbSM3sBAMoOPeDVfySKf/0Ocg9fi1yntWMgICIiyXT2dYcAmLxt4D3gSXhFPo7q61cgc3aDwlsF9Y+rITi5wDmgm9FjhRvXIeMYmYiISDLuSgWCG/l0QkHhBOd2naHwVkFblIuyP47Co/eDkDkpjR4X7OsGdyV//zWF3yEiIpJUdHcVNiVkGFx6WJWXjvKUE3AOCIWgcEJ1zmUU/fodnNoGos2Q8UbPLZcJiA5TWaNsh8NAQEREkhrXPxgbT6Yb3C7InVCZ8TtKTv0b+uoKKLzawbPvw/Aa8BRkzi4GjwNq+hCMHxBs4YodEwMBERFJKtTfE4O
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGZCAYAAAAUzjLvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABU3UlEQVR4nO3de1zUdb4/8NdcuF+G63hBEEHQQix1TUNNUbRSQyUvk5pdFOxsnd21tba1trLd7Oau/TqdToKtlorj/ZLlXUJNMys1RUERYbyCDHIdGJiZ7+8PY1YEhgEG5vZ6Ph7z2GW+t/f0wPm++Hw/F5EgCAKIiIjIaYmtXQARERFZF8MAERGRk2MYICIicnIMA0RERE6OYYCIiMjJMQwQERE5OYYBIiIiJ8cwQERE5OQYBoiIiJwcwwBRK61atQoikcj4cnd3R9euXREfH4/33nsPRUVF1i6xzdLT0/Hxxx9bu4wWrVixApMnT0Z4eDg8PDzQu3dv/Nd//Rdu3Lhh7dKI7JKI0xETtc6qVavw3HPPYeXKlejbty/q6upQVFSEI0eOYOXKlZBIJFi/fj0SEhKsXWqrTZw4EWfPnkV+fr61SzEpJCQE8fHxGD9+PEJCQpCTk4O///3v0Ov1OHnyJLp06WLtEonsitTaBRDZq379+uF3v/ud8ecnn3wSCxYswPDhw5GUlISLFy869E1Jr9dDp9PBzc2t06998uRJyOVy488jR47EwIEDMXjwYKSlpeGNN97o9JqI7BkfExBZUFhYGP75z3+ioqICy5cvb7Dtp59+QmJiIgICAuDu7o4BAwZgw4YNDfapfwRx8OBBJCcnIzAwEL6+vpgzZw6qqqpw8+ZNTJ8+HX5+fujWrRsWLlyIurq6BucoKSnB73//e4SEhMDV1RURERF4/fXXodVqTdY+atQofPPNNygoKGjwGAQA8vPzIRKJ8OGHH+If//gHevXqBTc3N2RkZJj92QDg5s2bmD9/Pnr06AFXV1f06tULixcvhk6na9V/57uDQL1BgwZBIpHgypUrrToXEbFlgMjixo8fD4lEgkOHDhnfy8jIwGOPPYYhQ4bg888/h0wmg1KpxIwZM6DRaPDss882OMe8efOQlJQEpVKJkydPYtGiRdDpdMjJyUFSUhJSUlKwf/9+fPDBB+jevTtefvllAEBNTQ3i4+Nx6dIlLF68GP3798fhw4fx3nvv4dSpU/jmm2+arfuzzz5DSkoKLl26hK1btza5zyeffILo6GgsXboUvr6+iIqKMvuz3bx5Ew899BDEYjHefPNNREZG4tixY/jHP/6B/Px8rFy5sl3/3TMzM6HX6xETE9Ou8xA5JYGIWmXlypUCAOHEiRPN7tOlSxfhvvvuM/7ct29fYcCAAUJdXV2D/SZOnCh069ZN0Ov1Dc793//93w32mzx5sgBA+Ne//tXg/QcffFAYOHCg8efPP/9cACBs2LChwX4ffPCBAEDYu3evyc82YcIEoWfPno3ev3z5sgBAiIyMFGpraxtsM/ezzZ8/X/D29hYKCgoa7Ld06VIBgJCVlWWyNlPKy8uF++67TwgNDRUqKirafB4iZ8XHBEQdQLirX25ubi6ys7Mxa9YsAIBOpzO+xo8fjxs3biAnJ6fB8RMnTmzw83333QcAmDBhQqP3CwoKjD8fPHgQXl5emDp1aoP96v86P3DgQLs+V2JiIlxcXNr02Xbu3In4+Hh07969wX6PP/44gDt/2bdFTU0NkpKSUFBQgI0bN8Lb27tdn5HIGfExAZGFVVVVQa1WIzY2FgBQWFgIAFi4cCEWLlzY5DHFxcUNfg4ICGjws6ura7Pv19TUGH9Wq9Xo2rWr8Vl/PblcDqlUCrVa3YZP9B/dunVr8HNrPlthYSG+/vrrBmGiqf1aQ6vVYsqUKThy5Ah27tyJIUOGtPocRMQwQGRx33zzDfR6PUaNGgUACAoKAgD89a9/RVJSUpPH9OnTxyLXDgwMxPHjxyEIQoNAUFRUBJ1OZ6ylre4NGa35bEFBQejfvz/efffdJvfr3r17q2rRarWYPHkyMjIysH37dowZM6ZVxxPRfzAMEFmQSqXCwoULIZPJMH/+fAB3boZRUVE4ffo0lixZ0qHXHzNmDDZs2IBt27ZhypQpxve/+uor43ZT3NzcUF1dbfb1WvPZJk6ciG+//RaRkZHw9/c3+xpNqW8ROHjwILZs2YJHH320XecjcnYMA0RtdPbsWeNz76KiIhw+fNg46dDWrVsRHBxs3Hf58uV4/PHH8eijj+LZZ59FSEgISkpKcP78efzyyy/YuHGjRWqaM2cO/vd//xfPPPMM8vPzERsbiyNHjmDJkiUYP358ixMhxcbGYsuWLfi///s/DBo0CGKxuMFcCk0x97O988472LdvH+Li4vCHP/wBffr0QU1NDfLz8/Htt9/i888/R48ePcz6nFOnTsWuXbvw+uuvIzAwED/88INxm6+vL+6//36zzkNEv7F2D0Yie1Pf47/+5erqKsjlcmHkyJHCkiVLhKKioiaPO336tDB9+nRBLpcLLi4uQteuXYXRo0cLn3/+eaNz3ztS4a233hIACLdu3Wrw/jPPPCN4eXk1eE+tVgsvvPCC0K1bN0EqlQo9e/YU/vrXvwo1NTUtfraSkhJh6tSpgp+fnyASiYT6r4j60QQfffRRmz+bIAjCrVu3hD/84Q9Cr169BBcXFyEgIEAYNGiQ8PrrrwuVlZUt1lfv7v/+975Gjhxp9nmI6A5OR0xEROTkOLSQiIjIybHPABHZDL1eD1ONlSKRCBKJpBMrInIObBkgIpsxZswYuLi4NPuKjIy0dolEDol9BojIZuTk5KCioqLZ7W5ubsbJnIjIchgGiIiInJxZfQYMBgOuX78OHx+fRjOQERERkW0SBAEVFRXo3r07xOLmewaYFQauX7+O0NBQixVHREREnefKlSsmJ/UyKwz4+PgYT+br62uZyoiIiKhDlZeXIzQ01Hgfb45ZYaD+0YCvry/DABERkZ1p6RE/hxYSERE5OYYBIiIiJ8cwQERE5OQYBoiIiJwcwwAREZGTYxggIiJycgwDRERETo5hgIiIyMkxDBARETk5hgEiIiInxzBARETk5BgGiIiInBzDABERkZMza9VCIiIiW1JdXY2SkhLjS61Wo6SkBBUVFdDpdNDr9dDr9bh58yaOHj2KKVOmQCKRGF+urq7w9/dHYGAgAgICjC8/Pz9IJBJrf7xOxzBAREQ2R61WIzs7Gzk5OcjOzkZ2djby8/ONN/6ampomj/Py8oJUKjXe9G/dugUAuHr1qjEg6PV6aLVa1NbWNjpeJBLBz88PAQEBkMvliI6ORt++fdG3b1/06dMHkZGRcHV17dDPbg0MA0REZFXXrl3DwYMHcfjwYZw/fx7Z2dkoLi4GcOfmHB4ejj59+mDEiBEICgpCQEBAo7/o6/+ql0rNu60JgtCodeHuFoaSkhLcuHED2dnZ2Lp1K8rLywEAEokEkZGR6Nu3Lx588EGMHj0aQ4cOhZubW4f99+kMIkEQhJZ2Ki8vh0wmQ1lZGXx9fTujLiIiclBqtRrfffcdDhw4gIMHDyInJwcAEBsbi9jY2AZ/iUdFRcHDw8Oq9QqCgMLCwgYtFefPn8eJEydQUlICDw8PDB8+HGPGjMHo0aMxcOBAm3nUYO79m2GAiIg6XE1NDTZt2oTU1FQcOXIEgiAgKioKo0ePxpgxYzBq1CgEBwdbu8xWMRgMOH36tDHUHDp0CFVVVfD398esWbOQkpKC2NhYq9bIMEBERFZ37tw5pKWl4csvv8Tt27cRHx+Pp59+GmPGjEFYWJi1y7Oo2tpanDhxAl9//TVWrVqFwsJCDB06FCkpKZg+fTq8vLw6vSaGASIisprs7Gz88Y9/xN69exEUFITnnnsO8+bNQ3R0tLVL6xR1dXX4+uuvsXz5cuzduxcymQx//etfsWDBgk7tgGju/ZvzDBARkcVoNBq8/vrr6N+/P3Jzc7Fu3TpcvXoVH374odMEAQBwcXFBUlIS9uzZg7y8PMyZMweLFi3CgAEDkJmZae3yGmEYICIii8jIyMD999+
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgQAAAGZCAYAAAD2EimWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRiElEQVR4nO3deVxU9d4H8M8s7JsC4haICKghKqmh5BKJikuU5FYu2KI9lXm1tMwy08zscXtstdui1yXRumJm5k6GueKKlCASYC6gM8oywzYz5/mDoFAYZnCGM8vn/Xrd1+vKOXPOd0yYD7/leySCIAggIiIiuyYVuwAiIiISHwMBERERMRAQERERAwERERGBgYCIiIjAQEBERERgICAiIiIwEBAREREYCIiIiAgMBERGW7t2LSQSSc3/nJ2d0apVK0RHR+P9999HQUGB2CU22jfffIP/+7//E7sMo02YMAESiQQjRowQuxQiq8VAQNRIa9aswZEjR7B371588skn6N69Oz744AN07twZ+/btE7u8RrHGQPDjjz9i27Zt8PT0FLsUIqvGQEDUSF26dEHv3r3Rr18/PPHEE1i5ciXOnTsHNzc3xMfHIz8/X+wSzUqr1aK8vFzUGgoLC/H888/j3XffRfPmzUWthcjaMRAQmVBAQACWL1+O4uJifP7557WOpaamIi4uDt7e3nB2dkZERAS2bNlS65zq6YgDBw5gypQp8PHxgaenJyZNmgSVSoXr169jzJgxaNasGVq3bo1Zs2ahsrKy1jWUSiVefPFFtG3bFo6OjggKCsKbb77Z4If3ww8/jB9//BG5ubm1pkQAICcnBxKJBP/7v/+LRYsWoX379nByckJycrLB7w0Arl+/jueffx733XcfHB0d0b59eyxYsAAajcbov2sAePXVV9G6dWtMnz69Ua8nor/JxS6AyNYMGzYMMpkMv/zyS83XkpOTERsbi8jISKxevRpeXl5ITEzE2LFjoVarMXny5FrXeO655xAfH4/ExEScPn0ac+fOhUajQUZGBuLj4zF16lTs27cPH3zwAdq0aYNXXnkFAFBWVobo6GhcunQJCxYsQNeuXZGSkoL3338fZ86cwY8//lhv3Z9++immTp2KS5cuISkpqc5zPvzwQ4SGhmLZsmXw9PRESEiIwe/t+vXrePDBByGVSvH222+jQ4cOOHLkCBYtWoSc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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGZCAYAAAAUzjLvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLx0lEQVR4nO3deVxU9f4/8NeZGRgEAdlGRUGUzSIsr3ExSo00cwvFNDW0NK3uNc00LcNfmUuWSV8rbdesi+ZSV7qWVkai4kbYdUUT0GBcEmSRZYCBmTm/PxCuKMwMMMPMMK/n4+HjEXO295jMec35bIIoiiKIiIjIbkksXQARERFZFsMAERGRnWMYICIisnMMA0RERHaOYYCIiMjOMQwQERHZOYYBIiIiO8cwQEREZOcYBoiIiOwcwwBRM3355ZcQBKH+j5OTE7p06YLo6Gi89dZbyM/Pt3SJLfb111/jvffes3QZBgUEBDT4f3Dr/w8iah6ZpQsgslUbNmxA7969UVNTg/z8fBw4cAArV65EQkICtm7diiFDhli6xGb7+uuvcfr0abz44ouWLkWvpKQkqNXqBq8plUpMmDABsbGxFqqKyHYxDBC10F133YV77723/ufHHnsMc+fOxQMPPICxY8ciKysLnTt3tmCF5qXVaqHRaCCXy9v82n379r3ttZ9//hkAMGPGjLYuh8jmsZmAyIT8/f3x7rvvoqysDJ9++mmDbUePHkVMTAw8PT3h5OSEvn37Ytu2bQ32qWuC2LNnD5555hl4eXnBzc0NTz75JFQqFa5evYrHH38cnTp1QteuXTF//nzU1NQ0OEdRURFmzpyJbt26wdHREb169cKiRYtu+yZ9qwcffBA7d+5Ebm5ug8fuAJCTkwNBEPDOO+9g+fLl6NmzJ+RyOVJSUox+bwBw9epVPPfcc+jevTscHR3Rs2dPLFmyBBqNptl/1zcTRREbNmxAr1698NBDD7XqXET2iE8GiExsxIgRkEql2L9/f/1rKSkpGDZsGCIjI/HJJ5/A3d0dW7ZswYQJE1BRUYGpU6c2OMeMGTMwduxYbNmyBceOHUN8fDw0Gg3OnTuHsWPH4tlnn0VycjJWrlwJX19fzJs3DwBQVVWF6OhonD9/HkuWLEGfPn2QmpqKt956C8ePH8fOnTubrPujjz7Cs88+i/PnzyMpKanRfT744AOEhIQgISEBbm5uCA4ONvq9Xb16FX//+98hkUjw+uuvIzAwEIcPH8by5cuRk5ODDRs2tPjvPDk5Gbm5uVi+fHl9gCGiZhCJqFk2bNggAhDT09Ob3Kdz587iHXfcUf9z7969xb59+4o1NTUN9hs1apTYtWtXUavVNjj37NmzG+w3ZswYEYD4f//3fw1ev+eee8S//e1v9T9/8sknIgBx27ZtDfZbuXKlCEDcvXu33vc2cuRIsUePHre9/ueff4oAxMDAQLG6urrBNmPf23PPPSd27NhRzM3NbbBfQkKCCEDMyMjQW5s+EyZMEKVSqXjp0qUWn4PInrGZgMgMRFGs/+/s7Gz88ccfiIuLAwBoNJr6PyNGjMBff/2Fc+fONTh+1KhRDX6+4447AAAjR4687fXc3Nz6n/fs2QMXFxeMGzeuwX51385//fXXVr2vmJgYODg4tOi9/fDDD4iOjoavr2+D/YYPHw4A2LdvX4tqKioqwnfffYdhw4ahW7durXp/RPaKzQREJqZSqVBYWIjw8HAAQF5eHgBg/vz5mD9/fqPHFBQUNPjZ09Ozwc+Ojo5Nvl5VVVX/c2FhIbp06XLbo3KFQgGZTIbCwsIWvKP/6dq1a4Ofm/Pe8vLy8P333zcIE43t11wbN26EWq1mx0GiVmAYIDKxnTt3QqvV4sEHHwQAeHt7AwBeffVVjB07ttFjQkNDTXJtLy8vpKWlQRTFBoEgPz8fGo2mvpaWujVkNOe9eXt7o0+fPnjzzTcb3c/X17dFNa1fvx6dO3e+7WkKERmPYYDIhJRKJebPnw93d3c899xzAGpvhsHBwThx4gRWrFhh1usPHjwY27Ztw3fffddgvP2//vWv+u36yOVyVFZWGn295ry3UaNGYdeuXQgMDISHh4fR19Dn6NGjOHnyJF5++WXIZPw4I2op/vYQtdDp06fr273z8/ORmpqKDRs2QCqVIikpCT4+PvX7fvrppxg+fDgeeeQRTJ06Fd26dUNRURHOnj2L//73v/jmm29MUtOTTz6JDz/8EE899RRycnIQHh6OAwcOYMWKFRgxYoTBiZDCw8Oxfft2fPzxx+jXrx8kEkmDuRQaY+x7W7p0KX755RdERUXhhRdeQGhoKKqqqpCTk4Ndu3bhk08+Qffu3Zv1ftevXw8AmD59erOOI6KGGAaIWmjatGkAatvtO3XqhDvuuAOvvPIKZsyY0SAIAEB0dDR+++03vPnmm3jxxRdRXFwMLy8v3HnnnXj88cdNVpOTkxNSUlKwaNEirFq1CteuXUO3bt0wf/58LF682ODxc+bMQUZGBuLj41FSUgJRFBt0hmyMse+ta9euOHr0KJYtW4ZVq1bh0qVLcHV1Rc+ePTFs2LBmPy2orKzE5s2bMXDgQISEhDTrWCJqSBAN/aYTERFRu8ahhURERHaOzQREZDW0Wq3eZglBECCVStuwIiL7wCcDRGQ1Bg8eDAcHhyb/BAYGWrpEonaJfQaIyGqcO3cOZWVlTW6Xy+X1kzkRkekwDBAREdk5o/oM6HQ6XLlyBa6urlwRjIiIyEaIooiysjL4+vpCImm6Z4BRYeDKlSvw8/MzWXFERETUdi5evKh3Ui+jwoCrq2v9ydzc3ExTGREREZlVaWkp/Pz86u/jTTEqDNQ1Dbi5uTEMEBER2RhDTfwcWkhERGTnGAaIiIjsHMMAERGRnWMYICIisnMMA0RERHaOYYCIiMjOMQwQERHZOYYBIiIiO8cwQEREZOcYBoiIiOwcwwAREZGdYxggIiKycwwDREREdo5hgIiIyM4xDBAREdk5hgEiIiI7J7N0AUREpqRSa5BTqEK1RgdHmQQBXi5wkfOjjkgf/oYQkc3LyivDpjQlUs7lQ1lUAfGmbQIAf09nRIcqEBfpj+DOrpYqk8hqCaIoioZ2Ki0thbu7O0pKSuDm5tYWdRERGXSxqALxSaeQml0AqUSAVtf0x1nd9gFB3lgRGw4/T+c2rJTIMoy9f7PPABHZpC3pSgxZvQ+HLhQCgN4gcPP2QxcKMWT1PmxJV5q9RrJ9KrUGGVdKcExZjIwrJVCpNZYuySzYTEBENmdtShYSdme26FitToRWJ2Lh9lMoKFdjVnSwiasjW2ePzU5sJiAim7IlXYmF20+Z7Hwrx4ZjQoS/yc5Htqs9NjuxmYCI2p2LRRVYvCPDpOd8fUcGLhZVmPScZHvsvdmJzQREZDPik05Bo+dDuvrqeVw/uBnVf2VCV6WC1M0HLncOgltkLCQOTo0eo9GJiE86hcTpkeYqm6wcm50YBojIRmTllSE1u6DJ7dUFSlzduAAyz27wGPwMJB3coL54GiUHN6P6ajYU415r9DitTkRqdgGy88sQpGgf7b9kvC3pyhYHgVsl7M6ET0e5TTY7MQwQkU3YlKbU246rOrMPoqYaPrHxcPDoCgDoEHA3tKpilB//CdqqckidOjZ6rFQiYOMRJd6ICTNb/WR9DDU7VV3MQMnhbai+/AdEbQ2krl5wueshdLp/UpPHvL4jA1GB3lbbh6Ap7DNARDYh5Vy+3nZcQSIFAEjkDT+EJXIXQJBAkDT93UerE5GSmW+aQslm6Gt2UmXsRd7Xr0Iid4HXqHlQjH8Dbv3HAQa63Nc1O9kaPhkgIqtXrtZAaaCTX8e7BqMs/T8o+vkjdIqeBmkHN1RdPI2y4z/B9W8jIXFsvM9AHWVhBVRqDacuthP6mp00ZQUo/GktOt4zDF6PzKx/3alHH4PntdVmJz4ZICKrl1uoMvSFDLJOndHlyQRUF+TiyiczcHH147j27VJ0vOsheAx51uA1RAA5hSqT1EvWr67ZqTHlJ3ZDrKmCe/9xLTp3XbOTLWEEJiKrV63RGdxHcz0P+d8uhdTFA53GvAqpszvUf51
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"class Graph:\n",
" def __init__(self, adj_list: dict = {}, name=\"Graph\", directed=False):\n",
2024-06-21 06:30:38 +00:00
" self.plt = plt\n",
"\n",
2024-06-21 06:30:38 +00:00
" self.nx = nx\n",
" # validation\n",
"\n",
2024-06-21 06:30:38 +00:00
" tmp = []\n",
" for i in adj_list:\n",
" tmp.extend(adj_list[i])\n",
"\n",
" if not directed and set(tmp) == set(adj_list.keys()):\n",
2024-06-21 06:30:38 +00:00
" self.adj_list = adj_list\n",
" self.directed = directed\n",
" self.name = name\n",
" else:\n",
" print(\"Error : It is not a valid graph\")\n",
"\n",
2024-06-21 06:30:38 +00:00
" def __str__(self):\n",
" string = \" \" + self.name + \"\\n\"\n",
2024-06-21 06:30:38 +00:00
" for i in self.adj_list.keys():\n",
" string += (\n",
" str(i) + \" : [\" + \",\".join([str(j) for j in self.adj_list[i]]) + \"]\\n\"\n",
" )\n",
2024-06-21 06:30:38 +00:00
" return string\n",
"\n",
" def add_node(self, node):\n",
2024-06-21 06:30:38 +00:00
" if node not in self.adj_list.keys():\n",
" self.adj_list[node] = []\n",
2024-06-21 06:30:38 +00:00
" else:\n",
" print(f\"Warning : the node'{node}' already exists\")\n",
"\n",
" def add_edge(self, node1, node2):\n",
2024-06-21 06:30:38 +00:00
" graph = self.adj_list\n",
" if node1 in graph and node2 in graph:\n",
2024-06-21 06:30:38 +00:00
" graph[node1].append(node2)\n",
" if not self.directed:\n",
2024-06-21 06:30:38 +00:00
" graph[node2].append(node1)\n",
"\n",
2024-06-21 06:30:38 +00:00
" def get_nodeSet(self):\n",
" return list(self.adj_list.keys())\n",
"\n",
2024-06-21 06:30:38 +00:00
" def get_edgSet(self):\n",
" edgSet = []\n",
" for i in self.adj_list.keys():\n",
" for j in self.adj_list[i]:\n",
" edgSet.append(tuple([i, j]))\n",
2024-06-21 06:30:38 +00:00
" return edgSet\n",
"\n",
" def dfs(self, node):\n",
" if node in self.adj_list.keys():\n",
2024-06-21 06:30:38 +00:00
" traverse = []\n",
" visited = set()\n",
" stack = [node]\n",
" while stack:\n",
2024-06-21 06:30:38 +00:00
" current = stack.pop()\n",
" if current not in visited:\n",
2024-06-21 06:30:38 +00:00
" visited.add(current)\n",
" traverse.append(current)\n",
" stack.extend(self.adj_list[current])\n",
"\n",
" return traverse\n",
" else:\n",
" print(f\"Error : node'{node}' does not exist in graph\")\n",
"\n",
" def bfs(self, node):\n",
" if node in self.adj_list.keys():\n",
2024-06-21 06:30:38 +00:00
" traverse = []\n",
" visited = set()\n",
" queue = [node]\n",
" while queue:\n",
2024-06-21 06:30:38 +00:00
" current = queue.pop(0)\n",
" if current not in visited:\n",
2024-06-21 06:30:38 +00:00
" visited.add(current)\n",
" traverse.append(current)\n",
" queue.extend(self.adj_list[current])\n",
" return traverse\n",
"\n",
2024-06-21 06:30:38 +00:00
" else:\n",
" print(f\"Error : node'{node}' does not exist in graph\")\n",
"\n",
" def getPath(self, n1, n2, path=[]):\n",
" g = self.adj_list\n",
" path += [n1]\n",
2024-06-21 06:30:38 +00:00
" if n2 not in g[n1]:\n",
" for i in g[n1]:\n",
" if i not in path:\n",
2024-06-21 06:30:38 +00:00
" path1 = self.getPath(i, n2, path.copy())\n",
" if path1:\n",
" return path1\n",
2024-06-21 06:30:38 +00:00
" else:\n",
" return path + [n2]\n",
"\n",
2024-06-21 06:30:38 +00:00
" def opt_path(self, path):\n",
" g = self.adj_list\n",
" l = len(path)\n",
2024-06-21 06:30:38 +00:00
" path1 = path.copy()\n",
" t = 2\n",
2024-06-21 06:30:38 +00:00
" for i in range(l):\n",
" for j in range(i + 2, l):\n",
" if abs(j - i) > t:\n",
2024-06-21 06:30:38 +00:00
" n1 = path[i]\n",
" n2 = path[j]\n",
" if n2 in g[n1]:\n",
" path1 = path[: i + 1] + path[j:]\n",
" t = abs(j - i)\n",
" return path1\n",
"\n",
" def sortestPath(self, n1, n2):\n",
" path = self.getPath(n1, n2)\n",
" spath = self.opt_path(path)\n",
2024-06-21 06:30:38 +00:00
" return spath\n",
"\n",
2024-06-21 06:30:38 +00:00
" def display(self):\n",
" G = self.nx.Graph()\n",
" G.add_nodes_from(self.get_nodeSet())\n",
" G.add_edges_from(self.get_edgSet())\n",
" self.nx.draw_networkx(G)\n",
" self.plt.title(self.name)\n",
" self.plt.show()\n",
"\n",
2024-06-21 06:30:38 +00:00
" def makeTree(self, Root=None):\n",
" temp_ls = dict()\n",
" if (Root == None) or (Root not in self.adj_list.keys()):\n",
2024-06-21 06:30:38 +00:00
" root = list(self.adj_list.keys())[0]\n",
" else:\n",
" root = Root\n",
" temp_ls[root] = [root]\n",
" stack = [root]\n",
"\n",
2024-06-21 06:30:38 +00:00
" def visite(root):\n",
" for i in self.adj_list[root]:\n",
" if root not in temp_ls:\n",
" temp_ls[root] = list()\n",
" if i not in stack:\n",
" stack.append(i)\n",
" temp_ls[root].append(i)\n",
" visite(i)\n",
"\n",
2024-06-21 06:30:38 +00:00
" visite(root)\n",
"\n",
2024-06-21 06:30:38 +00:00
" return temp_ls\n",
"\n",
"\n",
2024-06-21 06:30:38 +00:00
"adj_list = {\n",
" 0: [3, 5, 9, 10, 1],\n",
" 1: [6, 7, 4, 0, 10],\n",
" 2: [10, 5],\n",
" 3: [0],\n",
" 4: [1, 5, 8],\n",
" 5: [2, 0, 4],\n",
" 6: [1],\n",
" 7: [1],\n",
" 8: [4],\n",
" 9: [0],\n",
" 10: [2, 0],\n",
2024-06-21 06:30:38 +00:00
"}\n",
"g = Graph(adj_list, name=\"Demo\")\n",
2024-06-21 06:30:38 +00:00
"g.display()\n",
"for i in adj_list:\n",
" g1 = Graph(g.makeTree(Root=i), name=\"Demo tree_\" + str(i))\n",
" g1.display()"
2024-06-21 06:30:38 +00:00
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "29d9be84",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "03f1967f",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "8db9672a",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "457ca038",
"metadata": {},
"outputs": [],
"source": [
"print(g)\n",
"g.add_edge(8, 10)\n",
2024-06-21 06:30:38 +00:00
"print(g)\n",
"print(g.sortestPath(8, 10))\n",
2024-06-21 06:30:38 +00:00
"g.display()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "affba892",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 7,
"id": "9862c226",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[1, 2, 2, 3, 4, 5, 1, 7, 9, 90, 23, 41]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"class Tree:\n",
" def __init__(self, data, parent=None):\n",
2024-06-21 06:30:38 +00:00
" self.data = data\n",
" self.childs = []\n",
"\n",
" def addChild(self, *nodes):\n",
" childs = [Tree(i, parent=self) for i in nodes]\n",
2024-06-21 06:30:38 +00:00
" self.childs.extend(childs)\n",
" if len(childs) == 1:\n",
2024-06-21 06:30:38 +00:00
" return childs[0]\n",
" return childs\n",
"\n",
2024-06-21 06:30:38 +00:00
" def getChilds(self):\n",
" return [i.data for i in self.childs]\n",
"\n",
2024-06-21 06:30:38 +00:00
" def getElements(self):\n",
" elements = [self.data]\n",
" for i in self.childs:\n",
" elements.extend(i.getElements())\n",
" return elements\n",
"\n",
2024-06-21 06:30:38 +00:00
" def traverse(self, order=\"pre\"):\n",
" ls = []\n",
" if order == \"pre\":\n",
2024-06-21 06:30:38 +00:00
" ls.append(self.data)\n",
" for i in self.childs:\n",
" ls.extend(i.traverse(order=order))\n",
" return ls\n",
" elif order == \"post\":\n",
2024-06-21 06:30:38 +00:00
" for i in self.childs:\n",
" ls.extend(i.traverse(order=order))\n",
" ls.append(self.data)\n",
" return ls\n",
"\n",
"\n",
2024-06-21 06:30:38 +00:00
"tree = Tree(1)\n",
"t2 = tree.addChild(2)\n",
"t2t3 = t2.addChild(2, 3, 4, 5, 1, 7, 9)\n",
"tree.addChild(90, 23, 41)\n",
2024-06-21 06:30:38 +00:00
"tree.getElements()\n",
"# tree.traverse()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "102b3cb1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[2, 3, 4, 5, 1, 7, 9, 2, 90, 23, 41, 1]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tree.traverse(\"post\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "69202f88",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 9,
"id": "99b975a8",
"metadata": {},
"outputs": [],
"source": [
"class BTree:\n",
" def __init__(self, data, parent=None):\n",
2024-06-21 06:30:38 +00:00
" self.data = data\n",
" self.left = None\n",
" self.right = None\n",
" self.parent = parent\n",
"\n",
" def getElement(self, idx):\n",
" path = []\n",
" while idx > 0:\n",
" if idx % 2 == 1:\n",
" path.append((idx % 2))\n",
2024-06-21 06:30:38 +00:00
" idx //= 2\n",
" else:\n",
" path.append((idx % 2) + 2)\n",
" idx = idx // 2 - 1\n",
2024-06-21 06:30:38 +00:00
" temp = self\n",
" while path and temp:\n",
" dr = path.pop()\n",
" if dr == 1:\n",
2024-06-21 06:30:38 +00:00
" temp = temp.left\n",
" else:\n",
" temp = temp.right\n",
" if temp:\n",
2024-06-21 06:30:38 +00:00
" return temp\n",
" else:\n",
" print(\"id does not exists\")\n",
"\n",
2024-06-21 06:30:38 +00:00
" def getDepth(self):\n",
" ld = self.left.getDepth() if self.left else -1\n",
" rd = self.right.getDepth() if self.right else -1\n",
" return max(ld, rd) + 1\n",
"\n",
2024-06-21 06:30:38 +00:00
" def isBalanced(self):\n",
" ld = self.left.getDepth() if self.left else -1\n",
" rd = self.right.getDepth() if self.right else -1\n",
" if abs(ld - rd) in [0, 1]:\n",
2024-06-21 06:30:38 +00:00
" lb = self.left.isBalanced() if self.left else True\n",
" rb = self.right.isBalanced() if self.right else True\n",
" return bool(lb * rb)\n",
"\n",
2024-06-21 06:30:38 +00:00
" def getParent(self):\n",
" return self.parent\n",
"\n",
2024-06-21 06:30:38 +00:00
" def getChilds(self):\n",
" return [self.left, self.right]\n",
"\n",
2024-06-21 06:30:38 +00:00
" def getId(self):\n",
" if self.parent != None:\n",
" if self == self.parent.left:\n",
" return self.parent.getId() * 2 + 1\n",
2024-06-21 06:30:38 +00:00
" else:\n",
" return self.parent.getId() * 2 + 2\n",
2024-06-21 06:30:38 +00:00
" else:\n",
" return 0\n",
"\n",
" def __setattr__(self, key, value):\n",
2024-06-21 06:30:38 +00:00
" self.__dict__[key] = value\n",
" if value:\n",
" if key in [\"left\", \"right\"]:\n",
2024-06-21 06:30:38 +00:00
" value.parent = self\n",
"\n",
2024-06-21 06:30:38 +00:00
" def getSize(self):\n",
" lsize = self.left.getSize() if self.left else 0\n",
" rsize = self.right.getSize() if self.right else 0\n",
" return lsize + 1 + rsize\n",
"\n",
2024-06-21 06:30:38 +00:00
" def addData(self, data, idx=-1):\n",
" if idx == -1:\n",
" q = []\n",
" q.append(self)\n",
" while len(q):\n",
" temp = q[0]\n",
" q.pop(0)\n",
" if not temp.left:\n",
" temp.left = BTree(data, parent=temp)\n",
2024-06-21 06:30:38 +00:00
" break\n",
" else:\n",
" q.append(temp.left)\n",
" if not temp.right:\n",
2024-06-21 06:30:38 +00:00
" temp.right = BTree(data, parent=temp)\n",
" break\n",
" else:\n",
" q.append(temp.right)\n",
2024-06-21 06:30:38 +00:00
" else:\n",
" dr = idx % 2\n",
" if dr == 1:\n",
" ele = self.getElement(idx // 2)\n",
2024-06-21 06:30:38 +00:00
" ele.left = BTree(data, parent=ele)\n",
" else:\n",
" ele = self.getElement(idx // 2 - 1)\n",
2024-06-21 06:30:38 +00:00
" ele.right = BTree(data, parent=ele)\n",
"\n",
2024-06-21 06:30:38 +00:00
" def addNode(self, node, idx=-1):\n",
" if idx == -1:\n",
" q = []\n",
" q.append(self)\n",
" while len(q):\n",
" temp = q[0]\n",
" q.pop(0)\n",
" if not temp.left:\n",
" temp.left = node\n",
2024-06-21 06:30:38 +00:00
" break\n",
" else:\n",
" q.append(temp.left)\n",
" if not temp.right:\n",
2024-06-21 06:30:38 +00:00
" temp.right = node\n",
" break\n",
" else:\n",
" q.append(temp.right)\n",
"\n",
2024-06-21 06:30:38 +00:00
" def traverse(self, order=\"pre\"):\n",
" ls = []\n",
" if order == \"pre\":\n",
2024-06-21 06:30:38 +00:00
" ls.append(self.data)\n",
" if self.left:\n",
2024-06-21 06:30:38 +00:00
" ls.extend(self.left.traverse(order))\n",
" if self.right:\n",
2024-06-21 06:30:38 +00:00
" ls.extend(self.right.traverse(order))\n",
" return ls\n",
" elif order == \"post\":\n",
" if self.left:\n",
2024-06-21 06:30:38 +00:00
" ls.extend(self.left.traverse(order))\n",
" if self.right:\n",
2024-06-21 06:30:38 +00:00
" ls.extend(self.right.traverse(order))\n",
" ls.append(self.data)\n",
" return ls\n",
" elif order == \"in\":\n",
" if self.left:\n",
2024-06-21 06:30:38 +00:00
" ls.extend(self.left.traverse(order))\n",
" ls.append(self.data)\n",
" if self.right:\n",
2024-06-21 06:30:38 +00:00
" ls.extend(self.right.traverse(order))\n",
" return ls"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "9a28bb90",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[3, 4, 1, 5, 2, 0]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bt = BTree(0)\n",
"bt.left = BTree(1)\n",
2024-06-21 06:30:38 +00:00
"bt.right = BTree(2)\n",
"bt.left.left = BTree(3)\n",
"bt.left.right = BTree(4)\n",
"bt.right.left = BTree(5)\n",
"\n",
"\n",
"# bt.getElement(5)\n",
"bt.traverse(\"post\")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "af6dc0c6",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[9, 8, 17, 5, 11, 3, 4, 6, 14]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"btr = BTree(3)\n",
"ls = [5, 6, 8, 11, 4, 14, 9, 17]\n",
2024-06-21 06:30:38 +00:00
"for i in ls:\n",
" btr.addData(i)\n",
"btr.traverse(order=\"in\")\n",
"# btr.getElement(5).getId()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "d77046ab",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[3, 50, 6, 4, 14]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"btr.addData(50, idx=1)\n",
"btr.traverse()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "aa1c5c64",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"btr.data"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "26662a5c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(6, 5)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"btr.getElement(1).getId()\n",
"\n",
"\n",
"bt.getSize(), btr.getSize()"
2024-06-21 06:30:38 +00:00
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "83acc37e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[3, 50, 6, 4, 14]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"btr.traverse()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "563a1e0c",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "57ddb47c",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "9bcd3416",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "7f5772c1",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "d664751a",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "1b77949f",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
2024-11-20 17:22:43 +00:00
"version": "3.12.3"
2024-06-21 06:30:38 +00:00
}
},
"nbformat": 4,
"nbformat_minor": 5
}