{"componentChunkName":"component---src-templates-post-template-tsx","path":"/posts/leetcode-154/","result":{"data":{"markdownRemark":{"id":"a88b8711-09ce-5f78-9f59-de6992cde364","html":"<h3 id=\"sort-items-by-groups-respecting-dependencies\" style=\"position:relative;\"><a href=\"#sort-items-by-groups-respecting-dependencies\" aria-label=\"sort items by groups respecting 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><a href=\"https://leetcode.com/contest/weekly-contest-155/problems/sort-items-by-groups-respecting-dependencies/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Sort Items by Groups Respecting Dependencies</a></h3>\n<blockquote>\n<p>There are n items each belonging to zero or one of m groups where group[i] is the group that the i-th item belongs to and it’s equal to -1 if the i-th item belongs to no group. The items and the groups are zero indexed. A group can have no item belonging to it.</p>\n</blockquote>\n<blockquote>\n<p>Return a sorted list of the items such that:</p>\n</blockquote>\n<ul>\n<li>The items that belong to the same group are next to each other in the sorted list.</li>\n<li>There are some relations between these items where beforeItems[i] is a list containing all the items that should come before the i-th item in the sorted array (to the left of the i-th item).</li>\n</ul>\n<blockquote>\n<p>Return any solution if there is more than one solution and return an empty list if there is no solution.</p>\n</blockquote>\n<p>Keyword: <strong>Graph, Topological sort, DAG</strong></p>\n<p>Topological sorting for Directed Acyclic Graph (DAG) is a linear ordering of vertices such that for every directed edge uv, vertex u comes before v in the ordering. Topological Sorting for a graph is not possible if the graph is not a DAG. A directed graph doesn’t have topological sorting, if and only if it contains a cycle.</p>\n<p>In this problem, we need to do a cycle check and topological sorting between groups, and inside each group need another check and topological sorting.</p>\n<p>Steps:</p>\n<ol>\n<li>Get the <code class=\"language-text\">in_degree</code> map for groups and for items</li>\n<li>Sort groups. By sorting here, we get all nodes whose in degree is 0 (which means no dependency), add them in a <code class=\"language-text\">stack</code> and update in_degree map, and do the process again until there are no nodes. Then pop nodes from <code class=\"language-text\">stack</code> and get the topological sort result.</li>\n<li>Sort inside each group</li>\n</ol>\n<p>Reference:</p>\n<ul>\n<li><a href=\"https://www.geeksforgeeks.org/topological-sorting/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Topological sorting</a></li>\n</ul>\n<h3 id=\"critical-connections-in-a-network\" style=\"position:relative;\"><a href=\"#critical-connections-in-a-network\" aria-label=\"critical connections in a network 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 href=\"https://leetcode.com/problems/critical-connections-in-a-network/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Critical Connections in a Network</a></h3>\n<blockquote>\n<p>There are n servers numbered from 0 to n-1 connected by undirected server-to-server connections forming a network where connections[i] = [a, b] represents a connection between servers a and b. Any server can reach any other server directly or indirectly through the network.</p>\n</blockquote>\n<blockquote>\n<p>A critical connection is a connection that, if removed, will make some server unable to reach some other server.</p>\n</blockquote>\n<blockquote>\n<p>Return all critical connections in the network in any order.</p>\n</blockquote>\n<p>Keyword: <strong>Graph, DFS</strong></p>\n<p>Basically it’s a DFS over all the nodes, the difficult part is to check whether an edge is a ‘critical connection’ or not. To define this edge <code class=\"language-text\">[a,b]</code>, it’s critical if and only if there is no other way from a to reach b except this edge (not in a cycle).</p>\n<ul>\n<li><a href=\"https://www.geeksforgeeks.org/bridge-in-a-graph/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Another post to explain ‘Bridges in a graph’</a></li>\n<li><a href=\"https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Tarjan’s Algorithm to find Strongly Connected Components, which is the hint of this question</a> but it’s for directed graph</li>\n</ul>\n<p>Solution:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> __future__ <span class=\"token keyword\">import</span> print_function\n\n<span class=\"token keyword\">from</span> collections <span class=\"token keyword\">import</span> defaultdict\n\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Solution</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">object</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">criticalConnections</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">,</span> connections<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"\n        :type n: int\n        :type connections: List[List[int]]\n        :rtype: List[List[int]]\n        \"\"\"</span>\n        <span class=\"token builtin\">map</span> <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token builtin\">list</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">[</span>n1<span class=\"token punctuation\">,</span> n2<span class=\"token punctuation\">]</span> <span class=\"token keyword\">in</span> connections<span class=\"token punctuation\">:</span>\n            <span class=\"token builtin\">map</span><span class=\"token punctuation\">[</span>n1<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>n2<span class=\"token punctuation\">)</span>\n            <span class=\"token builtin\">map</span><span class=\"token punctuation\">[</span>n2<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>n1<span class=\"token punctuation\">)</span>\n\n        visited <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span><span class=\"token punctuation\">:</span> <span class=\"token boolean\">False</span><span class=\"token punctuation\">)</span>\n        <span class=\"token comment\"># node with lowest index that this node can reach</span>\n        lowestNode <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span><span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span><span class=\"token string\">'-inf'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token comment\"># time that dfs went through this node, or depth in DFS</span>\n        discoverTime <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span><span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span><span class=\"token string\">'-inf'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n        parentMap <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span><span class=\"token punctuation\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        results <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n        <span class=\"token keyword\">def</span> <span class=\"token function\">dfs</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">,</span> time<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> visited<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">return</span>\n            visited<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span>\n            lowestNode<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> time\n            discoverTime<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> time\n\n            <span class=\"token keyword\">for</span> t <span class=\"token keyword\">in</span> <span class=\"token builtin\">map</span><span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                <span class=\"token comment\"># dfs over all adjacent nodes</span>\n                <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> visited<span class=\"token punctuation\">[</span>t<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                    parentMap<span class=\"token punctuation\">[</span>t<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> node\n                    dfs<span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">,</span> time <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n                    lowestNode<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>lowestNode<span class=\"token punctuation\">[</span>t<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> lowestNode<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n                    <span class=\"token keyword\">if</span> lowestNode<span class=\"token punctuation\">[</span>t<span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> discoverTime<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                        results<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">,</span> t<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                    <span class=\"token keyword\">if</span> t <span class=\"token operator\">!=</span> parentMap<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                        lowestNode<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>lowestNode<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> discoverTime<span class=\"token punctuation\">[</span>t<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n        dfs<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> results\n\n\nn <span class=\"token operator\">=</span> <span class=\"token number\">4</span>\nconnections <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><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 punctuation\">,</span> <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><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\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <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 punctuation\">]</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>Solution<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>criticalConnections<span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">,</span> connections<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>","fields":{"slug":"/posts//posts/leetcode-154/","tagSlugs":["/tag/leetcode/"]},"frontmatter":{"date":"2019-09-16","tags":["Leetcode"],"title":"Leetcode Contest 154, 155 - Graph","description":"Weekly Contest 154 and 155: Graph, Topological sorting, DFS"}}},"pageContext":{"slug":"/posts//posts/leetcode-154/"}},"staticQueryHashes":["2625865275"],"slicesMap":{}}