{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/python-graphs/",
    "result": {"data":{"markdownRemark":{"html":"<h1 id=\"graphs-in-python\" style=\"position:relative;\"><a href=\"#graphs-in-python\" aria-label=\"graphs in python permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Graphs in Python</h1>\n<p>In this post, we're going to implement a graph data structure from scratch in Python.</p>\n<p>We'll create two different graph representations:</p>\n<ul>\n<li>An adjacency list</li>\n<li>An adjacency matrix</li>\n</ul>\n<p>Along the way, we'll explore nodes, edges, weights, directed graphs, undirected graphs, and some of the design decisions involved in representing relationships between objects.</p>\n<h2 id=\"prerequisites\" style=\"position:relative;\"><a href=\"#prerequisites\" aria-label=\"prerequisites permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>PREREQUISITES</h2>\n<ul>\n<li>Familiarity with Python</li>\n<li>Basic understanding of classes</li>\n<li>Some Programming Knowledge</li>\n</ul>\n<h2 id=\"goals\" style=\"position:relative;\"><a href=\"#goals\" aria-label=\"goals permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Goals</h2>\n<ul>\n<li>Understand the basic components of a graph</li>\n<li>Implement a weighted graph using adjacency lists</li>\n<li>Implement a graph using an adjacency matrix</li>\n<li>Support directed and undirected graphs</li>\n<li>Compare the two graph representations</li>\n</ul>\n<h1 id=\"graphs\" style=\"position:relative;\"><a href=\"#graphs\" aria-label=\"graphs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Graphs</h1>\n<p>Graphs are among the most useful data structures in computer science.</p>\n<p>They are used to represent relationships between objects.</p>\n<p>For example, a social network can be represented as a graph where people are nodes and friendships are edges.</p>\n<div class=\"mermaid\">graph LR\n    Alice --- Bob\n    Alice --- Emma\n    Bob --- John\n    Emma --- John</div>\n<p>A road network can be represented as a graph where cities are nodes and roads are edges.</p>\n<div class=\"mermaid\">graph LR\n    Delhi ---|212 km| Agra\n    Agra ---|238 km| Jaipur\n    Delhi ---|281 km| Jaipur</div>\n<p>Graphs are also used in:</p>\n<ul>\n<li>Computer networks</li>\n<li>Recommendation systems</li>\n<li>Build systems</li>\n<li>Package managers</li>\n<li>Navigation systems</li>\n<li>Search engines</li>\n<li>Compilers</li>\n<li>Social networks</li>\n</ul>\n<p>A graph consists of two primary components:</p>\n<ul>\n<li><strong>Vertices</strong>, which are usually called nodes</li>\n<li><strong>Edges</strong>, which connect the nodes</li>\n</ul>\n<p>Let's start with an edge.</p>\n<h1 id=\"the-edge-class\" style=\"position:relative;\"><a href=\"#the-edge-class\" aria-label=\"the edge class permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The <code class=\"language-text\">Edge</code> Class</h1>\n<p>An edge represents a connection between two nodes.</p>\n<p>For our implementation, an edge will contain three pieces of information:</p>\n<ul>\n<li>The node from which the edge starts</li>\n<li>The node at which the edge ends</li>\n<li>The weight of the edge</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Edge</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">,</span> weight<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>from_node <span class=\"token operator\">=</span> from_node\n        self<span class=\"token punctuation\">.</span>to_node <span class=\"token operator\">=</span> to_node\n        self<span class=\"token punctuation\">.</span>weight <span class=\"token operator\">=</span> weight</code></pre></div>\n<p>Let's create an edge.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> edge <span class=\"token operator\">=</span> Edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>This represents an edge from node <code class=\"language-text\">0</code> to node <code class=\"language-text\">1</code> with a weight of <code class=\"language-text\">5</code>.</p>\n<div class=\"mermaid\">graph LR\n    A((0)) -->|5| B((1))</div>\n<p>The meaning of the weight depends on the problem we're trying to solve.</p>\n<p>It could represent:</p>\n<ul>\n<li>Distance between two cities</li>\n<li>Cost of travelling along a route</li>\n<li>Time required to complete a task</li>\n<li>Network latency</li>\n<li>Strength of a relationship</li>\n</ul>\n<p>We can inspect the edge directly.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> edge<span class=\"token punctuation\">.</span>from_node\n<span class=\"token number\">0</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> edge<span class=\"token punctuation\">.</span>to_node\n<span class=\"token number\">1</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> edge<span class=\"token punctuation\">.</span>weight\n<span class=\"token number\">5</span></code></pre></div>\n<p>Our edge is ready.</p>\n<p>Now we need something to connect.</p>\n<h1 id=\"the-node-class\" style=\"position:relative;\"><a href=\"#the-node-class\" aria-label=\"the node class permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The <code class=\"language-text\">Node</code> Class</h1>\n<p>A node represents an object in our graph.</p>\n<p>Each node will have:</p>\n<ul>\n<li>A numeric index</li>\n<li>An optional label</li>\n<li>A collection of outgoing edges</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Node</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> index<span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span><span class=\"token boolean\">None</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>index <span class=\"token operator\">=</span> index\n        self<span class=\"token punctuation\">.</span>edges <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n        self<span class=\"token punctuation\">.</span>label <span class=\"token operator\">=</span> label</code></pre></div>\n<p>Let's create a node.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> node <span class=\"token operator\">=</span> Node<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span><span class=\"token string\">\"Delhi\"</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>index\n<span class=\"token number\">0</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>label\n<span class=\"token string\">'Delhi'</span></code></pre></div>\n<p>The <code class=\"language-text\">edges</code> dictionary will store the outgoing connections from this node.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>edges\n<span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>We use a dictionary where the key is the index of the neighbouring node and the value is the corresponding <code class=\"language-text\">Edge</code> object.</p>\n<p>For example:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token punctuation\">{</span>\n    <span class=\"token number\">1</span><span class=\"token punctuation\">:</span> Edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token number\">2</span><span class=\"token punctuation\">:</span> Edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Using a dictionary allows us to quickly locate an edge when we already know the target node.</p>\n<h1 id=\"adding-an-edge-to-a-node\" style=\"position:relative;\"><a href=\"#adding-an-edge-to-a-node\" aria-label=\"adding an edge to a node permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Adding an Edge to a Node</h1>\n<p>Let's add a method for creating an outgoing edge.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">add_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> target<span class=\"token punctuation\">,</span> weight<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">[</span>target<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> Edge<span class=\"token punctuation\">(</span>\n        self<span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">,</span>\n        target<span class=\"token punctuation\">,</span>\n        weight\n    <span class=\"token punctuation\">)</span></code></pre></div>\n<p>The method creates an <code class=\"language-text\">Edge</code> object and stores it using the target node as the dictionary key.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>add_edge<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Our node now represents the following structure:</p>\n<div class=\"mermaid\">graph LR\n    A((0)) -->|5| B((1))</div>\n<p>We can inspect the edge.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>edges\n<span class=\"token punctuation\">{</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span> <span class=\"token operator\">&lt;</span>__main__<span class=\"token punctuation\">.</span>Edge <span class=\"token builtin\">object</span> at 0x<span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token operator\">></span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>That output isn't particularly helpful.</p>\n<p>Let's add a representation to the <code class=\"language-text\">Edge</code> class.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Edge</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">,</span> weight<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>from_node <span class=\"token operator\">=</span> from_node\n        self<span class=\"token punctuation\">.</span>to_node <span class=\"token operator\">=</span> to_node\n        self<span class=\"token punctuation\">.</span>weight <span class=\"token operator\">=</span> weight\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__repr__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f\"Edge(</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>self<span class=\"token punctuation\">.</span>from_node<span class=\"token punctuation\">}</span></span><span class=\"token string\">, \"</span></span>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f\"</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>self<span class=\"token punctuation\">.</span>to_node<span class=\"token punctuation\">}</span></span><span class=\"token string\">, \"</span></span>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f\"weight=</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>self<span class=\"token punctuation\">.</span>weight<span class=\"token punctuation\">}</span></span><span class=\"token string\">)\"</span></span>\n        <span class=\"token punctuation\">)</span></code></pre></div>\n<p>Now our edge is easier to understand.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>edges\n<span class=\"token punctuation\">{</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span> Edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>Much better.</p>\n<h1 id=\"removing-an-edge\" style=\"position:relative;\"><a href=\"#removing-an-edge\" aria-label=\"removing an edge permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Removing an Edge</h1>\n<p>Removing an edge from a node is simply a matter of deleting it from the dictionary.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">remove_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> target<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">del</span> self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">[</span>target<span class=\"token punctuation\">]</span></code></pre></div>\n<p>For example:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>remove_edge<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>edges\n<span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>If the edge doesn't exist, Python will raise a <code class=\"language-text\">KeyError</code>.</p>\n<p>If we want the method to silently ignore missing edges, we could instead use:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">remove_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> target<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">,</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>For now, we'll keep the stricter version. Attempting to remove an edge that doesn't exist is probably a programming error, and raising an exception makes that problem visible.</p>\n<h1 id=\"getting-an-edge\" style=\"position:relative;\"><a href=\"#getting-an-edge\" aria-label=\"getting an edge permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Getting an Edge</h1>\n<p>We can retrieve a particular edge using its neighbouring node.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">get_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> neighbor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>neighbor<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Let's add an edge and retrieve it.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>add_edge<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\nEdge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>If the connection doesn't exist, the method returns <code class=\"language-text\">None</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">7</span><span class=\"token punctuation\">)</span>\n<span class=\"token boolean\">None</span></code></pre></div>\n<h1 id=\"getting-all-edges\" style=\"position:relative;\"><a href=\"#getting-all-edges\" aria-label=\"getting all edges permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Getting All Edges</h1>\n<p>Sometimes we want all the outgoing edges from a node.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">get_edges</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Let's add a couple of connections.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>add_edge<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>add_edge<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> <span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>get_edges<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">[</span>Edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> Edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>Notice that we're returning a dictionary values view rather than creating another list.</p>\n<p>The caller can still create a list if required:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>get_edges<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>However, we avoid creating an unnecessary copy when the caller only wants to iterate over the edges.</p>\n<h1 id=\"counting-edges\" style=\"position:relative;\"><a href=\"#counting-edges\" aria-label=\"counting edges permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Counting Edges</h1>\n<p>The number of outgoing edges is simply the size of our dictionary.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">num_edges</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">return</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>num_edges<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token number\">2</span></code></pre></div>\n<p>We could also expose this through Python's Data Model.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">__len__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">return</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">)</span></code></pre></div>\n<p>This lets us write:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span>\n<span class=\"token number\">2</span></code></pre></div>\n<p>Both approaches are valid. The second one makes our object feel more like a native Python collection.</p>\n<h1 id=\"getting-the-neighbours\" style=\"position:relative;\"><a href=\"#getting-the-neighbours\" aria-label=\"getting the neighbours permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Getting the Neighbours</h1>\n<p>A neighbour is any node connected to the current node by an outgoing edge.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">get_neighbors</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    neighbors <span class=\"token operator\">=</span> <span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">for</span> edge <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        neighbors<span class=\"token punctuation\">.</span>add<span class=\"token punctuation\">(</span>edge<span class=\"token punctuation\">.</span>to_node<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span> neighbors</code></pre></div>\n<p>For our current node:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>get_neighbors<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>The structure looks like this:</p>\n<div class=\"mermaid\">graph LR\n    A((0)) -->|5| B((1))\n    A -->|8| C((2))</div>\n<p>We return a set because every neighbour should appear only once.</p>\n<p>Since our edges are already stored in a dictionary keyed by the target node, this method could also be written more simply:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">get_neighbors</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">return</span> <span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">)</span></code></pre></div>\n<p>This is one of the benefits of selecting an appropriate internal representation. Sometimes a good representation makes several operations almost trivial.</p>\n<h1 id=\"sorting-the-edges\" style=\"position:relative;\"><a href=\"#sorting-the-edges\" aria-label=\"sorting the edges permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Sorting the Edges</h1>\n<p>We can also return the edges sorted by the index of their target node.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">get_sorted_edge_list</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    result <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n    <span class=\"token keyword\">for</span> neighbor <span class=\"token keyword\">in</span> <span class=\"token builtin\">sorted</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        result<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">[</span>neighbor<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span> result</code></pre></div>\n<p>For example:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> node <span class=\"token operator\">=</span> Node<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>add_edge<span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>add_edge<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>add_edge<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>get_sorted_edge_list<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">[</span>\n    Edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">7</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    Edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    Edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<p>The edges are sorted by the target node, not by their weights.</p>\n<p>If we wanted to sort by weight instead, we could write:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">get_edges_sorted_by_weight</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">return</span> <span class=\"token builtin\">sorted</span><span class=\"token punctuation\">(</span>\n        self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        key<span class=\"token operator\">=</span><span class=\"token keyword\">lambda</span> edge<span class=\"token punctuation\">:</span> edge<span class=\"token punctuation\">.</span>weight\n    <span class=\"token punctuation\">)</span></code></pre></div>\n<p>Now that we have nodes and edges, let's build a graph.</p>\n<h1 id=\"the-graph-class\" style=\"position:relative;\"><a href=\"#the-graph-class\" aria-label=\"the graph class permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The <code class=\"language-text\">Graph</code> Class</h1>\n<p>Our first graph implementation will use an <strong>adjacency list</strong>.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Graph</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> num_nodes<span class=\"token punctuation\">,</span> undirected<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>num_nodes <span class=\"token operator\">=</span> num_nodes\n        self<span class=\"token punctuation\">.</span>undirected <span class=\"token operator\">=</span> undirected\n        self<span class=\"token punctuation\">.</span>nodes <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n            Node<span class=\"token punctuation\">(</span>index<span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">for</span> index <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>num_nodes<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">]</span></code></pre></div>\n<p>Creating a graph with five nodes:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph <span class=\"token operator\">=</span> Graph<span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>produces:</p>\n<div class=\"mermaid\">graph LR\n    A((0))\n    B((1))\n    C((2))\n    D((3))\n    E((4))</div>\n<p>There are five nodes, but there are no connections yet.</p>\n<p>Every node is assigned an index based on its position in the <code class=\"language-text\">nodes</code> list.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>index\n<span class=\"token number\">0</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>index\n<span class=\"token number\">4</span></code></pre></div>\n<h1 id=\"validating-node-indices\" style=\"position:relative;\"><a href=\"#validating-node-indices\" aria-label=\"validating node indices permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Validating Node Indices</h1>\n<p>Before adding or retrieving an edge, we need to make sure both node indices exist.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">_verify_node_indices</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">if</span> from_node <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> from_node <span class=\"token operator\">>=</span> self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">raise</span> IndexError<span class=\"token punctuation\">(</span><span class=\"token string\">\"Source node is out of range\"</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">if</span> to_node <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> to_node <span class=\"token operator\">>=</span> self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">raise</span> IndexError<span class=\"token punctuation\">(</span><span class=\"token string\">\"Target node is out of range\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Now invalid indices produce a useful error.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\nIndexError<span class=\"token punctuation\">:</span> Target node <span class=\"token keyword\">is</span> out of <span class=\"token builtin\">range</span></code></pre></div>\n<p>The leading underscore in <code class=\"language-text\">_verify_node_indices</code> indicates that this is an internal helper method.</p>\n<p>It doesn't make the method private, but it tells other developers that the method is intended for internal use.</p>\n<h1 id=\"adding-edges\" style=\"position:relative;\"><a href=\"#adding-edges\" aria-label=\"adding edges permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Adding Edges</h1>\n<p>Let's add a method for connecting two nodes.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">insert_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">,</span> weight<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    self<span class=\"token punctuation\">.</span>_verify_node_indices<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span>\n\n    self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>from_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>add_edge<span class=\"token punctuation\">(</span>\n        to_node<span class=\"token punctuation\">,</span>\n        weight\n    <span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>undirected<span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>to_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>add_edge<span class=\"token punctuation\">(</span>\n            from_node<span class=\"token punctuation\">,</span>\n            weight\n        <span class=\"token punctuation\">)</span></code></pre></div>\n<p>For a directed graph, the edge is added only to the source node.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>insert_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span></code></pre></div>\n<div class=\"mermaid\">graph LR\n    A((0)) -->|5| B((1))</div>\n<p>The arrow is important.</p>\n<p>Node <code class=\"language-text\">0</code> connects to node <code class=\"language-text\">1</code>, but node <code class=\"language-text\">1</code> doesn't automatically connect back to node <code class=\"language-text\">0</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\nEdge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n<span class=\"token boolean\">None</span></code></pre></div>\n<h1 id=\"directed-graphs\" style=\"position:relative;\"><a href=\"#directed-graphs\" aria-label=\"directed graphs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Directed Graphs</h1>\n<p>A directed graph contains edges with a specific direction.</p>\n<p>Consider a dependency system.</p>\n<div class=\"mermaid\">graph LR\n    A[Compile] --> B[Test]\n    B --> C[Deploy]</div>\n<p>Testing depends on compilation, and deployment depends on testing.</p>\n<p>These relationships aren't necessarily reversible.</p>\n<p>A directed flight route provides another example.</p>\n<div class=\"mermaid\">graph LR\n    A[City A] --> B[City B]</div>\n<p>A flight from City A to City B doesn't automatically mean there is a corresponding flight from City B to City A.</p>\n<h1 id=\"undirected-graphs\" style=\"position:relative;\"><a href=\"#undirected-graphs\" aria-label=\"undirected graphs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Undirected Graphs</h1>\n<p>In an undirected graph, an edge represents a connection in both directions.</p>\n<p>We can create one by passing <code class=\"language-text\">undirected=True</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> network <span class=\"token operator\">=</span> Graph<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> undirected<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> network<span class=\"token punctuation\">.</span>insert_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Internally, the graph creates two directed edges:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token number\">0</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token number\">1</span>\n<span class=\"token number\">1</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token number\">0</span></code></pre></div>\n<p>Together, they represent one undirected relationship.</p>\n<div class=\"mermaid\">graph LR\n    A((0)) ---|5| B((1))</div>\n<p>Now both lookups succeed.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> network<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\nEdge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> network<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\nEdge<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h1 id=\"building-a-weighted-graph\" style=\"position:relative;\"><a href=\"#building-a-weighted-graph\" aria-label=\"building a weighted graph permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Building a Weighted Graph</h1>\n<p>Let's create a more interesting graph.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph <span class=\"token operator\">=</span> Graph<span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>insert_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>insert_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>insert_edge<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>insert_edge<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>insert_edge<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>insert_edge<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>The result looks like this:</p>\n<div class=\"mermaid\">graph LR\n    A((0)) -->|5| B((1))\n    A -->|3| C((2))\n    B -->|1| D((3))\n    C -->|6| D\n    C -->|8| E((4))\n    D -->|2| E</div>\n<p>The same graph can be described as an adjacency list.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">0 -> (1, 5), (2, 3)\n1 -> (3, 1)\n2 -> (3, 6), (4, 8)\n3 -> (4, 2)\n4 -></code></pre></div>\n<p>Each row tells us which nodes can be reached directly from a particular node.</p>\n<h1 id=\"getting-an-edge-from-the-graph\" style=\"position:relative;\"><a href=\"#getting-an-edge-from-the-graph\" aria-label=\"getting an edge from the graph permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Getting an Edge from the Graph</h1>\n<p>Our graph delegates edge retrieval to the corresponding node.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">get_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    self<span class=\"token punctuation\">.</span>_verify_node_indices<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>from_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span>to_node<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\nEdge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>If the edge doesn't exist:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n<span class=\"token boolean\">None</span></code></pre></div>\n<h1 id=\"checking-whether-an-edge-exists\" style=\"position:relative;\"><a href=\"#checking-whether-an-edge-exists\" aria-label=\"checking whether an edge exists permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Checking Whether an Edge Exists</h1>\n<p>We can build a convenience method on top of <code class=\"language-text\">get_edge</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">is_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span> <span class=\"token keyword\">is</span> <span class=\"token keyword\">not</span> <span class=\"token boolean\">None</span></code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>is_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n<span class=\"token boolean\">True</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>is_edge<span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n<span class=\"token boolean\">False</span></code></pre></div>\n<p>Notice that we didn't duplicate our lookup logic.</p>\n<p>Whenever possible, it's usually better to build new functionality using methods we've already tested.</p>\n<h1 id=\"creating-an-edge-list\" style=\"position:relative;\"><a href=\"#creating-an-edge-list\" aria-label=\"creating an edge list permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Creating an Edge List</h1>\n<p>Sometimes we need a single list containing every edge in the graph.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">make_edge_list</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    edges <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n    <span class=\"token keyword\">for</span> node <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">for</span> edge <span class=\"token keyword\">in</span> node<span class=\"token punctuation\">.</span>get_edges<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            edges<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>edge<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span> edges</code></pre></div>\n<p>Let's try it.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>make_edge_list<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">[</span>\n    Edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    Edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    Edge<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    Edge<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">6</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    Edge<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    Edge<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> weight<span class=\"token operator\">=</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<p>This representation is particularly useful for algorithms that need to examine every edge.</p>\n<h1 id=\"removing-an-edge-1\" style=\"position:relative;\"><a href=\"#removing-an-edge-1\" aria-label=\"removing an edge 1 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Removing an Edge</h1>\n<p>Removing an edge is similar to inserting one.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">remove_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    self<span class=\"token punctuation\">.</span>_verify_node_indices<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span>\n\n    self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>from_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>remove_edge<span class=\"token punctuation\">(</span>to_node<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>undirected<span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>to_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>remove_edge<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">)</span></code></pre></div>\n<p>For a directed graph, only one edge is removed.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>remove_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>is_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n<span class=\"token boolean\">False</span></code></pre></div>\n<p>For an undirected graph, we remove both internal edges.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> network <span class=\"token operator\">=</span> Graph<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> undirected<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> network<span class=\"token punctuation\">.</span>insert_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> network<span class=\"token punctuation\">.</span>remove_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> network<span class=\"token punctuation\">.</span>is_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n<span class=\"token boolean\">False</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> network<span class=\"token punctuation\">.</span>is_edge<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n<span class=\"token boolean\">False</span></code></pre></div>\n<h1 id=\"adding-a-node\" style=\"position:relative;\"><a href=\"#adding-a-node\" aria-label=\"adding a node permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Adding a Node</h1>\n<p>Let's allow the graph to grow after it has been created.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">insert_node</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span><span class=\"token boolean\">None</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    node <span class=\"token operator\">=</span> Node<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span>label<span class=\"token punctuation\">)</span>\n\n    self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span>\n    self<span class=\"token punctuation\">.</span>num_nodes <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n\n    <span class=\"token keyword\">return</span> node</code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph <span class=\"token operator\">=</span> Graph<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>insert_node<span class=\"token punctuation\">(</span>label<span class=\"token operator\">=</span><span class=\"token string\">\"New Node\"</span><span class=\"token punctuation\">)</span>\nNew Node</code></pre></div>\n<p>Our graph now contains four nodes.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>num_nodes\n<span class=\"token number\">4</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>label\n<span class=\"token string\">'New Node'</span></code></pre></div>\n<p>Let's add a useful representation to <code class=\"language-text\">Node</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">__repr__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>label <span class=\"token keyword\">is</span> <span class=\"token keyword\">not</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>label<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token string-interpolation\"><span class=\"token string\">f\"Node(</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>self<span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">}</span></span><span class=\"token string\">)\"</span></span></code></pre></div>\n<p>Now labelled nodes display their labels, while unlabelled nodes display their indices.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\nNode<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span>\nNew Node</code></pre></div>\n<h1 id=\"finding-incoming-neighbours\" style=\"position:relative;\"><a href=\"#finding-incoming-neighbours\" aria-label=\"finding incoming neighbours permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Finding Incoming Neighbours</h1>\n<p>The edges stored inside a node tell us about its outgoing neighbours.</p>\n<p>For example:</p>\n<div class=\"mermaid\">graph LR\n    A((0)) --> B((1))</div>\n<p>Node <code class=\"language-text\">1</code> is an outgoing neighbour of node <code class=\"language-text\">0</code>.</p>\n<p>But what if we want to know which nodes point to node <code class=\"language-text\">1</code>?</p>\n<p>These are called its <strong>incoming neighbours</strong>.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">get_in_neighbors</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> target<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">if</span> target <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> target <span class=\"token operator\">>=</span> self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">raise</span> IndexError<span class=\"token punctuation\">(</span><span class=\"token string\">\"Target node is out of range\"</span><span class=\"token punctuation\">)</span>\n\n    neighbors <span class=\"token operator\">=</span> <span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">for</span> node <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> target <span class=\"token keyword\">in</span> node<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">:</span>\n            neighbors<span class=\"token punctuation\">.</span>add<span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span> neighbors</code></pre></div>\n<p>Consider this graph:</p>\n<div class=\"mermaid\">graph LR\n    A((0)) --> D((3))\n    B((1)) --> D\n    C((2)) --> D</div>\n<p>Calling:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>get_in_neighbors<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>would return nodes <code class=\"language-text\">0</code>, <code class=\"language-text\">1</code>, and <code class=\"language-text\">2</code>.</p>\n<p>The adjacency list makes outgoing-neighbour lookups easy. Finding incoming neighbours requires us to inspect the outgoing edges of every node.</p>\n<p>This is an important trade-off in data structure design. A representation that makes one operation fast may make another operation more expensive.</p>\n<h1 id=\"copying-a-graph\" style=\"position:relative;\"><a href=\"#copying-a-graph\" aria-label=\"copying a graph permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Copying a Graph</h1>\n<p>Let's create a copy of our graph.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">make_copy</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    copied_graph <span class=\"token operator\">=</span> Graph<span class=\"token punctuation\">(</span>\n        self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">,</span>\n        undirected<span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>undirected\n    <span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">for</span> node <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">:</span>\n        copied_graph<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>label <span class=\"token operator\">=</span> node<span class=\"token punctuation\">.</span>label\n\n    <span class=\"token keyword\">for</span> edge <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>make_edge_list<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        copied_graph<span class=\"token punctuation\">.</span>insert_edge<span class=\"token punctuation\">(</span>\n            edge<span class=\"token punctuation\">.</span>from_node<span class=\"token punctuation\">,</span>\n            edge<span class=\"token punctuation\">.</span>to_node<span class=\"token punctuation\">,</span>\n            edge<span class=\"token punctuation\">.</span>weight\n        <span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span> copied_graph</code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> copied_graph <span class=\"token operator\">=</span> graph<span class=\"token punctuation\">.</span>make_copy<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>The copied graph has its own nodes and edges.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> copied_graph <span class=\"token keyword\">is</span> graph\n<span class=\"token boolean\">False</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> copied_graph<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">is</span> graph<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n<span class=\"token boolean\">False</span></code></pre></div>\n<p>Changing the copy doesn't change the original.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> copied_graph<span class=\"token punctuation\">.</span>remove_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> copied_graph<span class=\"token punctuation\">.</span>is_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n<span class=\"token boolean\">False</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>is_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n<span class=\"token boolean\">True</span></code></pre></div>\n<h1 id=\"implementing-the-python-data-model\" style=\"position:relative;\"><a href=\"#implementing-the-python-data-model\" aria-label=\"implementing the python data model permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Implementing the Python Data Model</h1>\n<p>We can add a few special methods to make our graph easier to use.</p>\n<h2 id=\"implementing-__len__\" style=\"position:relative;\"><a href=\"#implementing-__len__\" aria-label=\"implementing __len__ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Implementing <code class=\"language-text\">__len__</code></h2>\n<p>The length of the graph is the number of nodes.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">__len__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>num_nodes</code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>graph<span class=\"token punctuation\">)</span>\n<span class=\"token number\">5</span></code></pre></div>\n<h2 id=\"implementing-__getitem__\" style=\"position:relative;\"><a href=\"#implementing-__getitem__\" aria-label=\"implementing __getitem__ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Implementing <code class=\"language-text\">__getitem__</code></h2>\n<p>Let's make nodes accessible using square brackets.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">__getitem__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> index<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">if</span> index <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> index <span class=\"token operator\">>=</span> self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">raise</span> IndexError<span class=\"token punctuation\">(</span><span class=\"token string\">\"Node index is out of range\"</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span></code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\nNode<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"implementing-__iter__\" style=\"position:relative;\"><a href=\"#implementing-__iter__\" aria-label=\"implementing __iter__ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Implementing <code class=\"language-text\">__iter__</code></h2>\n<p>We can also make the graph iterable.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">__iter__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">yield</span> <span class=\"token keyword\">from</span> self<span class=\"token punctuation\">.</span>nodes</code></pre></div>\n<p>This allows us to loop over the nodes.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> <span class=\"token keyword\">for</span> node <span class=\"token keyword\">in</span> graph<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>     <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span></code></pre></div>\n<p>With these methods, our custom graph begins to behave like a native Python collection.</p>\n<h1 id=\"the-complete-adjacency-list-implementation\" style=\"position:relative;\"><a href=\"#the-complete-adjacency-list-implementation\" aria-label=\"the complete adjacency list implementation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The Complete Adjacency List Implementation</h1>\n<p>Here's our complete implementation so far.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Edge</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">,</span> weight<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>from_node <span class=\"token operator\">=</span> from_node\n        self<span class=\"token punctuation\">.</span>to_node <span class=\"token operator\">=</span> to_node\n        self<span class=\"token punctuation\">.</span>weight <span class=\"token operator\">=</span> weight\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__repr__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f\"Edge(</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>self<span class=\"token punctuation\">.</span>from_node<span class=\"token punctuation\">}</span></span><span class=\"token string\">, \"</span></span>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f\"</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>self<span class=\"token punctuation\">.</span>to_node<span class=\"token punctuation\">}</span></span><span class=\"token string\">, \"</span></span>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f\"weight=</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>self<span class=\"token punctuation\">.</span>weight<span class=\"token punctuation\">}</span></span><span class=\"token string\">)\"</span></span>\n        <span class=\"token punctuation\">)</span>\n\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Node</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> index<span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span><span class=\"token boolean\">None</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>index <span class=\"token operator\">=</span> index\n        self<span class=\"token punctuation\">.</span>edges <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n        self<span class=\"token punctuation\">.</span>label <span class=\"token operator\">=</span> label\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__repr__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>label <span class=\"token keyword\">is</span> <span class=\"token keyword\">not</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">return</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>label<span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token string-interpolation\"><span class=\"token string\">f\"Node(</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>self<span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">}</span></span><span class=\"token string\">)\"</span></span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__len__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">add_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> target<span class=\"token punctuation\">,</span> weight<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">[</span>target<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> Edge<span class=\"token punctuation\">(</span>\n            self<span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">,</span>\n            target<span class=\"token punctuation\">,</span>\n            weight\n        <span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">remove_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> target<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">del</span> self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">[</span>target<span class=\"token punctuation\">]</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">num_edges</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">get_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> neighbor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>neighbor<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">get_edges</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">get_sorted_edge_list</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        result <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n        <span class=\"token keyword\">for</span> neighbor <span class=\"token keyword\">in</span> <span class=\"token builtin\">sorted</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            result<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">[</span>neighbor<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">return</span> result\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">get_neighbors</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">)</span>\n\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Graph</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> num_nodes<span class=\"token punctuation\">,</span> undirected<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>num_nodes <span class=\"token operator\">=</span> num_nodes\n        self<span class=\"token punctuation\">.</span>undirected <span class=\"token operator\">=</span> undirected\n        self<span class=\"token punctuation\">.</span>nodes <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n            Node<span class=\"token punctuation\">(</span>index<span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">for</span> index <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>num_nodes<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">]</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__len__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>num_nodes\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__getitem__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> index<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> index <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> index <span class=\"token operator\">>=</span> self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">raise</span> IndexError<span class=\"token punctuation\">(</span><span class=\"token string\">\"Node index is out of range\"</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__iter__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">yield</span> <span class=\"token keyword\">from</span> self<span class=\"token punctuation\">.</span>nodes\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">_verify_node_indices</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> from_node <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> from_node <span class=\"token operator\">>=</span> self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">raise</span> IndexError<span class=\"token punctuation\">(</span><span class=\"token string\">\"Source node is out of range\"</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">if</span> to_node <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> to_node <span class=\"token operator\">>=</span> self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">raise</span> IndexError<span class=\"token punctuation\">(</span><span class=\"token string\">\"Target node is out of range\"</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">get_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>_verify_node_indices<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>from_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span>to_node<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">is_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span> <span class=\"token keyword\">is</span> <span class=\"token keyword\">not</span> <span class=\"token boolean\">None</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">make_edge_list</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        edges <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n        <span class=\"token keyword\">for</span> node <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">for</span> edge <span class=\"token keyword\">in</span> node<span class=\"token punctuation\">.</span>get_edges<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                edges<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>edge<span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">return</span> edges\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">insert_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">,</span> weight<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>_verify_node_indices<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span>\n\n        self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>from_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>add_edge<span class=\"token punctuation\">(</span>\n            to_node<span class=\"token punctuation\">,</span>\n            weight\n        <span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>undirected<span class=\"token punctuation\">:</span>\n            self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>to_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>add_edge<span class=\"token punctuation\">(</span>\n                from_node<span class=\"token punctuation\">,</span>\n                weight\n            <span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">remove_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>_verify_node_indices<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span>\n\n        self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>from_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>remove_edge<span class=\"token punctuation\">(</span>to_node<span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>undirected<span class=\"token punctuation\">:</span>\n            self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>to_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>remove_edge<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">insert_node</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span><span class=\"token boolean\">None</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        node <span class=\"token operator\">=</span> Node<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span>label<span class=\"token punctuation\">)</span>\n\n        self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>num_nodes <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n\n        <span class=\"token keyword\">return</span> node\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">make_copy</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        copied_graph <span class=\"token operator\">=</span> Graph<span class=\"token punctuation\">(</span>\n            self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">,</span>\n            undirected<span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>undirected\n        <span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">for</span> node <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">:</span>\n            copied_graph<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>label <span class=\"token operator\">=</span> node<span class=\"token punctuation\">.</span>label\n\n        <span class=\"token keyword\">for</span> edge <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>make_edge_list<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            copied_graph<span class=\"token punctuation\">.</span>insert_edge<span class=\"token punctuation\">(</span>\n                edge<span class=\"token punctuation\">.</span>from_node<span class=\"token punctuation\">,</span>\n                edge<span class=\"token punctuation\">.</span>to_node<span class=\"token punctuation\">,</span>\n                edge<span class=\"token punctuation\">.</span>weight\n            <span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">return</span> copied_graph\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">get_in_neighbors</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> target<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> target <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> target <span class=\"token operator\">>=</span> self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">raise</span> IndexError<span class=\"token punctuation\">(</span><span class=\"token string\">\"Target node is out of range\"</span><span class=\"token punctuation\">)</span>\n\n        neighbors <span class=\"token operator\">=</span> <span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">for</span> node <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> target <span class=\"token keyword\">in</span> node<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">:</span>\n                neighbors<span class=\"token punctuation\">.</span>add<span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">return</span> neighbors</code></pre></div>\n<h1 id=\"adjacency-matrices\" style=\"position:relative;\"><a href=\"#adjacency-matrices\" aria-label=\"adjacency matrices permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Adjacency Matrices</h1>\n<p>The adjacency list isn't the only way to represent a graph.</p>\n<p>Another popular representation is an <strong>adjacency matrix</strong>.</p>\n<p>An adjacency matrix is a two-dimensional structure where rows represent source nodes and columns represent target nodes.</p>\n<p>Consider this graph:</p>\n<div class=\"mermaid\">graph LR\n    A((0)) -->|5| B((1))\n    A -->|3| C((2))\n    B -->|1| D((3))\n    C -->|6| D</div>\n<p>Its adjacency matrix looks like this:</p>\n<table>\n<thead>\n<tr>\n<th align=\"center\">From / To</th>\n<th align=\"right\">0</th>\n<th align=\"right\">1</th>\n<th align=\"right\">2</th>\n<th align=\"right\">3</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"center\"><strong>0</strong></td>\n<td align=\"right\">0</td>\n<td align=\"right\">5</td>\n<td align=\"right\">3</td>\n<td align=\"right\">0</td>\n</tr>\n<tr>\n<td align=\"center\"><strong>1</strong></td>\n<td align=\"right\">0</td>\n<td align=\"right\">0</td>\n<td align=\"right\">0</td>\n<td align=\"right\">1</td>\n</tr>\n<tr>\n<td align=\"center\"><strong>2</strong></td>\n<td align=\"right\">0</td>\n<td align=\"right\">0</td>\n<td align=\"right\">0</td>\n<td align=\"right\">6</td>\n</tr>\n<tr>\n<td align=\"center\"><strong>3</strong></td>\n<td align=\"right\">0</td>\n<td align=\"right\">0</td>\n<td align=\"right\">0</td>\n<td align=\"right\">0</td>\n</tr>\n</tbody>\n</table>\n<p>For example:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">matrix[0][1] = 5</code></pre></div>\n<p>means that there is an edge from node <code class=\"language-text\">0</code> to node <code class=\"language-text\">1</code> with a weight of <code class=\"language-text\">5</code>.</p>\n<p>Similarly:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">matrix[1][0] = 0</code></pre></div>\n<p>means that we haven't stored an edge from node <code class=\"language-text\">1</code> to node <code class=\"language-text\">0</code>.</p>\n<h1 id=\"the-graphmatrix-class\" style=\"position:relative;\"><a href=\"#the-graphmatrix-class\" aria-label=\"the graphmatrix class permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The <code class=\"language-text\">GraphMatrix</code> Class</h1>\n<p>Let's implement it.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">GraphMatrix</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> num_nodes<span class=\"token punctuation\">,</span> undirected<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>num_nodes <span class=\"token operator\">=</span> num_nodes\n        self<span class=\"token punctuation\">.</span>undirected <span class=\"token operator\">=</span> undirected\n\n        self<span class=\"token punctuation\">.</span>connections <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n            <span class=\"token punctuation\">[</span><span class=\"token number\">0.0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">*</span> num_nodes\n            <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>num_nodes<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">]</span></code></pre></div>\n<p>Creating a graph with four nodes:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> matrix <span class=\"token operator\">=</span> GraphMatrix<span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>initializes:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">[</span><span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">[</span><span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">[</span><span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">[</span><span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<p>Every possible pair of nodes receives a position in the matrix.</p>\n<h1 id=\"setting-an-edge\" style=\"position:relative;\"><a href=\"#setting-an-edge\" aria-label=\"setting an edge permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Setting an Edge</h1>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">set_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">,</span> weight<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    self<span class=\"token punctuation\">.</span>_verify_node_indices<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span>\n\n    self<span class=\"token punctuation\">.</span>connections<span class=\"token punctuation\">[</span>from_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>to_node<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> weight\n\n    <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>undirected<span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>connections<span class=\"token punctuation\">[</span>to_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>from_node<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> weight</code></pre></div>\n<p>Let's add an edge.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> matrix<span class=\"token punctuation\">.</span>set_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>The matrix becomes:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">[</span><span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>   <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">[</span><span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">[</span><span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">[</span><span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<h1 id=\"getting-an-edge-1\" style=\"position:relative;\"><a href=\"#getting-an-edge-1\" aria-label=\"getting an edge 1 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Getting an Edge</h1>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">get_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    self<span class=\"token punctuation\">.</span>_verify_node_indices<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>connections<span class=\"token punctuation\">[</span>from_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>to_node<span class=\"token punctuation\">]</span></code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> matrix<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n<span class=\"token number\">5</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> matrix<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n<span class=\"token number\">0.0</span></code></pre></div>\n<p>Edge lookup is straightforward because we know exactly where the value is stored.</p>\n<h1 id=\"removing-an-edge-2\" style=\"position:relative;\"><a href=\"#removing-an-edge-2\" aria-label=\"removing an edge 2 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Removing an Edge</h1>\n<p>We can remove an edge by resetting its matrix entry.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">remove_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    self<span class=\"token punctuation\">.</span>set_edge<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>If the graph is undirected, <code class=\"language-text\">set_edge</code> automatically clears both directions.</p>\n<h1 id=\"complete-adjacency-matrix-implementation\" style=\"position:relative;\"><a href=\"#complete-adjacency-matrix-implementation\" aria-label=\"complete adjacency matrix implementation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Complete Adjacency Matrix Implementation</h1>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">GraphMatrix</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> num_nodes<span class=\"token punctuation\">,</span> undirected<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>num_nodes <span class=\"token operator\">=</span> num_nodes\n        self<span class=\"token punctuation\">.</span>undirected <span class=\"token operator\">=</span> undirected\n\n        self<span class=\"token punctuation\">.</span>connections <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n            <span class=\"token punctuation\">[</span><span class=\"token number\">0.0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">*</span> num_nodes\n            <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>num_nodes<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">]</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__len__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>num_nodes\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">_verify_node_indices</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> from_node <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> from_node <span class=\"token operator\">>=</span> self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">raise</span> IndexError<span class=\"token punctuation\">(</span><span class=\"token string\">\"Source node is out of range\"</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">if</span> to_node <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> to_node <span class=\"token operator\">>=</span> self<span class=\"token punctuation\">.</span>num_nodes<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">raise</span> IndexError<span class=\"token punctuation\">(</span><span class=\"token string\">\"Target node is out of range\"</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">get_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>_verify_node_indices<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>connections<span class=\"token punctuation\">[</span>from_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>to_node<span class=\"token punctuation\">]</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">set_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">,</span> weight<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>_verify_node_indices<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span>\n\n        self<span class=\"token punctuation\">.</span>connections<span class=\"token punctuation\">[</span>from_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>to_node<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> weight\n\n        <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>undirected<span class=\"token punctuation\">:</span>\n            self<span class=\"token punctuation\">.</span>connections<span class=\"token punctuation\">[</span>to_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>from_node<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> weight\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">remove_edge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>set_edge<span class=\"token punctuation\">(</span>from_node<span class=\"token punctuation\">,</span> to_node<span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h1 id=\"adjacency-list-vs-adjacency-matrix\" style=\"position:relative;\"><a href=\"#adjacency-list-vs-adjacency-matrix\" aria-label=\"adjacency list vs adjacency matrix permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Adjacency List vs Adjacency Matrix</h1>\n<p>We now have two representations of the same data structure.</p>\n<h2 id=\"adjacency-list\" style=\"position:relative;\"><a href=\"#adjacency-list\" aria-label=\"adjacency list permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Adjacency List</h2>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">0 -> 1, 2\n1 -> 3\n2 -> 3\n3 -></code></pre></div>\n<p>The adjacency list stores only the edges that actually exist.</p>\n<p>It is usually a good choice when the graph contains relatively few connections compared with the total number of possible connections.</p>\n<h2 id=\"adjacency-matrix\" style=\"position:relative;\"><a href=\"#adjacency-matrix\" aria-label=\"adjacency matrix permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Adjacency Matrix</h2>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">0 5 3 0\n0 0 0 1\n0 0 0 6\n0 0 0 0</code></pre></div>\n<p>The adjacency matrix reserves space for every possible connection.</p>\n<p>It makes checking a particular node pair straightforward, but it may reserve a lot of unused space.</p>\n<p>For a graph with <code class=\"language-text\">n</code> nodes, the matrix contains:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">n × n</code></pre></div>\n<p>entries even when the graph contains only a handful of edges.</p>\n<h1 id=\"a-note-about-zero-weight-edges\" style=\"position:relative;\"><a href=\"#a-note-about-zero-weight-edges\" aria-label=\"a note about zero weight edges permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>A Note About Zero-Weight Edges</h1>\n<p>Our matrix uses <code class=\"language-text\">0.0</code> to represent the absence of an edge.</p>\n<p>This creates an important limitation.</p>\n<p>What if an actual edge has a weight of zero?</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">matrix<span class=\"token punctuation\">.</span>set_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>We can no longer distinguish between:</p>\n<ul>\n<li>A missing edge</li>\n<li>An edge with zero weight</li>\n</ul>\n<p>One possible solution is to use <code class=\"language-text\">None</code> instead of <code class=\"language-text\">0.0</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">self<span class=\"token punctuation\">.</span>connections <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">[</span><span class=\"token boolean\">None</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">*</span> num_nodes\n    <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>num_nodes<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n<span class=\"token boolean\">None</span></code></pre></div>\n<p>means:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">No edge exists</code></pre></div>\n<p>while:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>set_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> graph<span class=\"token punctuation\">.</span>get_edge<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n<span class=\"token number\">0.0</span></code></pre></div>\n<p>represents a valid edge whose weight happens to be zero.</p>\n<p>Small implementation details like this often determine which problems a data structure can solve correctly.</p>\n<h1 id=\"adjacency-lists-vs-adjacency-matrices\" style=\"position:relative;\"><a href=\"#adjacency-lists-vs-adjacency-matrices\" aria-label=\"adjacency lists vs adjacency matrices permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Adjacency Lists vs Adjacency Matrices</h1>\n<p>We now have two completely different implementations that represent exactly the same graph.</p>\n<h2 id=\"adjacency-list-1\" style=\"position:relative;\"><a href=\"#adjacency-list-1\" aria-label=\"adjacency list 1 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Adjacency List</h2>\n<div class=\"mermaid\">graph LR\n    A((0)) -->|5| B((1))\n    A -->|3| C((2))\n    B -->|1| D((3))\n    C -->|6| D</div>\n<p>Internally:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token number\">0</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span>\n<span class=\"token number\">1</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n<span class=\"token number\">2</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">)</span>\n<span class=\"token number\">3</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span></code></pre></div>\n<p>Only existing edges consume memory.</p>\n<p>An adjacency list is generally a good choice when the graph contains relatively few edges compared with the total number of possible connections.</p>\n<p>Such graphs are often called <strong>sparse graphs</strong>.</p>\n<div class=\"mermaid\">graph LR\n    A((0))\n    B((1))\n    C((2))\n    D((3))\n    E((4))\n\n    A --> B\n    C --> D</div>\n<p>Most real-world graphs are sparse.</p>\n<p>Examples include:</p>\n<ul>\n<li>Social networks</li>\n<li>Computer networks</li>\n<li>Road systems</li>\n<li>Dependency graphs</li>\n</ul>\n<h2 id=\"adjacency-matrix-1\" style=\"position:relative;\"><a href=\"#adjacency-matrix-1\" aria-label=\"adjacency matrix 1 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Adjacency Matrix</h2>\n<p>The same graph can be represented as:</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>0</th>\n<th>1</th>\n<th>2</th>\n<th>3</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>0</strong></td>\n<td>0</td>\n<td>5</td>\n<td>3</td>\n<td>0</td>\n</tr>\n<tr>\n<td><strong>1</strong></td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>1</td>\n</tr>\n<tr>\n<td><strong>2</strong></td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>6</td>\n</tr>\n<tr>\n<td><strong>3</strong></td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n</tr>\n</tbody>\n</table>\n<p>The matrix stores space for every possible connection.</p>\n<p>This makes edge lookups extremely simple:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> matrix<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span>\n<span class=\"token number\">3</span></code></pre></div>\n<p>However, it also means we may allocate memory for many edges that don't exist.</p>\n<p>Consider a graph with:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">10,000 nodes</code></pre></div>\n<p>An adjacency matrix would require:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">10,000 × 10,000\n=\n100,000,000 entries</code></pre></div>\n<p>even if the graph only contains a handful of connections.</p>\n<h1 id=\"time-complexity\" style=\"position:relative;\"><a href=\"#time-complexity\" aria-label=\"time complexity permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Time Complexity</h1>\n<p>Let's compare the two representations.</p>\n<table>\n<thead>\n<tr>\n<th>Operation</th>\n<th>Adjacency List</th>\n<th>Adjacency Matrix</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Add Edge</td>\n<td>O(1)</td>\n<td>O(1)</td>\n</tr>\n<tr>\n<td>Remove Edge</td>\n<td>O(1)</td>\n<td>O(1)</td>\n</tr>\n<tr>\n<td>Edge Lookup</td>\n<td>O(1)*</td>\n<td>O(1)</td>\n</tr>\n<tr>\n<td>Iterate Neighbors</td>\n<td>O(k)</td>\n<td>O(n)</td>\n</tr>\n<tr>\n<td>Memory Usage</td>\n<td>O(V + E)</td>\n<td>O(V²)</td>\n</tr>\n</tbody>\n</table>\n<p>Where:</p>\n<ul>\n<li><code class=\"language-text\">V</code> = Number of vertices</li>\n<li><code class=\"language-text\">E</code> = Number of edges</li>\n<li><code class=\"language-text\">k</code> = Number of neighbors</li>\n</ul>\n<p>The adjacency list is usually preferred for large sparse graphs.</p>\n<p>The adjacency matrix becomes attractive when:</p>\n<ul>\n<li>The graph is dense</li>\n<li>Fast edge lookups are important</li>\n<li>Memory usage is less of a concern</li>\n</ul>\n<h1 id=\"real-world-examples\" style=\"position:relative;\"><a href=\"#real-world-examples\" aria-label=\"real world examples permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Real-World Examples</h1>\n<h2 id=\"social-networks\" style=\"position:relative;\"><a href=\"#social-networks\" aria-label=\"social networks permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Social Networks</h2>\n<div class=\"mermaid\">graph LR\n    Alice --- Bob\n    Alice --- Emma\n    Emma --- John\n    Bob --- John</div>\n<p>Nodes:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Users</code></pre></div>\n<p>Edges:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Friendships</code></pre></div>\n<h2 id=\"road-networks\" style=\"position:relative;\"><a href=\"#road-networks\" aria-label=\"road networks permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Road Networks</h2>\n<div class=\"mermaid\">graph LR\n    Delhi ---|220 km| Agra\n    Agra ---|240 km| Jaipur\n    Delhi ---|280 km| Jaipur</div>\n<p>Nodes:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Cities</code></pre></div>\n<p>Edges:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Roads</code></pre></div>\n<p>Weights:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Distance</code></pre></div>\n<h2 id=\"computer-networks\" style=\"position:relative;\"><a href=\"#computer-networks\" aria-label=\"computer networks permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Computer Networks</h2>\n<div class=\"mermaid\">graph LR\n    Router --> Switch\n    Switch --> Server\n    Switch --> Workstation</div>\n<p>Nodes:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Devices</code></pre></div>\n<p>Edges:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Network Connections</code></pre></div>\n<p>Weights:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Latency\nBandwidth\nCost</code></pre></div>\n<h2 id=\"package-dependencies\" style=\"position:relative;\"><a href=\"#package-dependencies\" aria-label=\"package dependencies permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Package Dependencies</h2>\n<div class=\"mermaid\">graph TD\n    App --> Requests\n    App --> NumPy\n    Requests --> urllib3</div>\n<p>Nodes:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Packages</code></pre></div>\n<p>Edges:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Dependencies</code></pre></div>\n<p>This structure appears in:</p>\n<ul>\n<li>pip</li>\n<li>npm</li>\n<li>Maven</li>\n<li>Gradle</li>\n</ul>\n<h1 id=\"common-graph-algorithms\" style=\"position:relative;\"><a href=\"#common-graph-algorithms\" aria-label=\"common graph algorithms permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Common Graph Algorithms</h1>\n<p>Now that we have a graph representation, we can begin exploring graph algorithms.</p>\n<p>Some of the most useful algorithms include:</p>\n<h3 id=\"breadth-first-search-bfs\" style=\"position:relative;\"><a href=\"#breadth-first-search-bfs\" aria-label=\"breadth first search bfs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Breadth First Search (BFS)</h3>\n<p>Explores a graph level by level.</p>\n<div class=\"mermaid\">graph TD\n    A((A))\n    B((B))\n    C((C))\n    D((D))\n    E((E))\n\n    A --> B\n    A --> C\n    B --> D\n    C --> E</div>\n<p>Used for:</p>\n<ul>\n<li>Finding shortest paths in unweighted graphs</li>\n<li>Web crawlers</li>\n<li>Social network analysis</li>\n</ul>\n<h3 id=\"depth-first-search-dfs\" style=\"position:relative;\"><a href=\"#depth-first-search-dfs\" aria-label=\"depth first search dfs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Depth First Search (DFS)</h3>\n<p>Explores one path completely before backtracking.</p>\n<div class=\"mermaid\">graph TD\n    A((A))\n    B((B))\n    C((C))\n    D((D))\n\n    A --> B\n    B --> C\n    C --> D</div>\n<p>Used for:</p>\n<ul>\n<li>Cycle detection</li>\n<li>Path finding</li>\n<li>Topological sorting</li>\n</ul>\n<h3 id=\"dijkstras-algorithm\" style=\"position:relative;\"><a href=\"#dijkstras-algorithm\" aria-label=\"dijkstras algorithm permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Dijkstra's Algorithm</h3>\n<p>Finds the shortest path in a weighted graph.</p>\n<div class=\"mermaid\">graph LR\n    A((A)) -->|4| B((B))\n    A -->|1| C((C))\n    C -->|2| B</div>\n<p>We'll eventually combine graphs with our Heap implementation to build this algorithm from scratch.</p>\n<h3 id=\"minimum-spanning-trees\" style=\"position:relative;\"><a href=\"#minimum-spanning-trees\" aria-label=\"minimum spanning trees permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Minimum Spanning Trees</h3>\n<p>Find the minimum cost required to connect all nodes.</p>\n<p>Popular algorithms include:</p>\n<ul>\n<li>Kruskal's Algorithm</li>\n<li>Prim's Algorithm</li>\n</ul>\n<h3 id=\"topological-sorting\" style=\"position:relative;\"><a href=\"#topological-sorting\" aria-label=\"topological sorting permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Topological Sorting</h3>\n<p>Used to order tasks with dependencies.</p>\n<div class=\"mermaid\">graph TD\n    Compile --> Test\n    Test --> Package\n    Package --> Deploy</div>\n<h1 id=\"oh-yeah-its-all-coming-together\" style=\"position:relative;\"><a href=\"#oh-yeah-its-all-coming-together\" aria-label=\"oh yeah its all coming together permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Oh Yeah, It's All Coming Together</h1>\n<p>At this point we've implemented:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">Edge\nNode\nGraph\nGraphMatrix</code></pre></div>\n<p>Along the way we learned about:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">Directed Graphs\nUndirected Graphs\nWeighted Graphs\nAdjacency Lists\nAdjacency Matrices\nNeighbors\nEdge Lookups\nGraph Traversal</code></pre></div>\n<p>Just like our Linked List, Tree, and Heap implementations, the real lesson wasn't simply building a graph.</p>\n<p>The real lesson was understanding how different representations can model relationships between objects.</p>\n<p>Once you understand graphs, you'll start seeing them everywhere.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Road Maps\nSocial Networks\nRecommendation Engines\nComputer Networks\nBuild Systems\nPackage Managers\nSearch Engines\nCompilers\nOperating Systems</code></pre></div>\n<p>Graphs are one of the most versatile data structures in computer science.</p>\n<p>And now we have our own implementation.</p>\n<p>That's it folks!</p>","excerpt":"Graphs in Python In this post, we're going to implement a graph data structure from scratch in Python. We'll create two different graph…","fields":{"slug":"/python-graphs/"},"frontmatter":{"title":"Graphs in Python","date":"April 17, 2026","tags":["Python"],"categories":["Highlight","Python"],"description":"Graphs in Python","comments_off":false,"thumbnail":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAADb0lEQVQ4y22V3W9UVRTF51/xwSd8IeFBTXzSB0yQSCDESBUJUWPAGIuxktYQMYaYgoUEYwlNMZRQpRYxQ2vrx9AyNtJpobRDa2f6NdMvSi2axgbmnL3P/Zl779zOTOlNTu7kzD7rrL322vvGWH88PC98hws8r/Qurc1joicWbToXBt4YFOrOCnP3NQhwrvKAH9MSt5y6aDHWlYF6mwM2tFi2veYYGJVy7jw2ihWPviHD7mph+yFh+d/ipWUsywDDzWze0RIvMJkXrvdaP5zz7cK+T5Sm9gK3xyzZnDA5K0WZQhmi1GMRcgQ4t6QMjRuONwpbXlUyOUvLdeXFt5WxGaH+gvBxQ5SuV6FzALhR7KZ2Q/NPlqGM0NplWfhbeLiq/Pqn4e645egZYX+dUDBaUbDod8xnpkV2/6wqOw4rO99XuvsMt4YNh74Qdn4Qptj2i2FmwbL2SIn3Cld/D9P2MfwVAG6s4EDacmtEGJuyZHLCuR+UmtPC/RXL/lrlzVqfsbD7Q8cLbznmH2ilbRYeKEsriqrj61ahI6kBg1cOC9UnfQZa1MrxeaPw1UXhr2lD01VD6p7Q1v2YkayQX1REPWJ7qpUDnwqLy5aX31MO1CmZvOXgMcPlzjAldZHojolZof03w3BWOHNJGJ0STjRZtr2udNwUYvXfCjWnLR3JQhA0NS9cSxSYnrfkFgQjbt20XX3CM7uUy52WzqTw1HbHtYQvj/LOceHuuPgahi4fmRC+uRIWIdFv+a7LsnWv0jMQWmR6TgJNPzrl20pQp4HWq/9FF4bvmJ+JFnVt/lHYulcYHFOyeWHfUWEka/GzeP4Nn7khkzN0JC1HTgqTc6G+vnahbcp86P+x9sgxkQ/T7r1tGc5a/rhjSKSEmgahPy2kszZoz2erlHiPDTXW0vCIRYYO2ydkWn/B8vQOJXnH8n234UbKBtU+1+Z3iSMzY4P2DFKNCBVxYuVdEhl8el65FLdB2x08pjxXpcwuCZ81CnuOKMMZQ3/aBLHRmQBns+EwkPbNLCRShvhNw5VuCcaVEY+C8VhdU1p/Fk6ctzjPhSUtMvQhnxhfXzZbtuxygddKg7Q0ntQ5qmqFl95Vlh+WZmYUFdvY4Isrjp5BW2TsBQ5wrjwLj9FJIXVPy7T31u+s6OWN47xUMG/DZ+LJM9H2/zJlun01rfO9AAAAAElFTkSuQmCC","width":150,"height":150,"src":"/static/69f2d8d1b40d14d0b146d5519b185068/92ab1/graphs.png","srcSet":"/static/69f2d8d1b40d14d0b146d5519b185068/92ab1/graphs.png 1x,\n/static/69f2d8d1b40d14d0b146d5519b185068/668a7/graphs.png 1.5x,\n/static/69f2d8d1b40d14d0b146d5519b185068/56e34/graphs.png 2x"}}}}}},"pageContext":{"slug":"/python-graphs/","previous":{"id":"caa5e25b-9f7c-56c9-8144-d0888aed46dd","frontmatter":{"title":"Heap in Python","tags":["Python"],"categories":["Highlight","Python"],"template":"post"},"fields":{"slug":"/python-heap/"}},"next":null}},
    "staticQueryHashes": []}