{
"cells": [
{
"cell_type": "markdown",
"id": "80140856",
"metadata": {},
"source": [
"## See detailed notes in [vishnu.uk/blogs/algorithms](http://vishnu.uk/blogs/algorithms.html#cycles-in-undirected-graphs)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "9e837c76",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from IPython.display import display, HTML\n",
"display(HTML(\"\"))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "cc73c891",
"metadata": {},
"outputs": [],
"source": [
"import networkx as nx\n",
"import matplotlib.pyplot as plt\n",
"def draw_graph(graph):\n",
" G = nx.Graph(graph)\n",
" pos = nx.spring_layout(G)\n",
" plt.figure(figsize=(4,2))\n",
" nx.draw(G,pos, with_labels=True)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "e0210c46",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"