{"componentChunkName":"component---src-templates-blog-js","path":"/blog/algorithm/algo_20200320_1/","result":{"data":{"markdownRemark":{"html":"<h2>방향 그래프에서, 시작 노드에서 다른 모든 노드로 가는 Shortest Path 구하기. (Dijkstra)</h2>\n<p><img src=\"/mdimg/algo_20200320_1.jpg\" alt=\"image\"></p>\n<h3>조건 : 경로가 존재하지 않을 수 있음. 서로 다른 두 정점 사이에 여러 개의 간선이 존재할 수도 있음.</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">모든 정점까지의 경로가 존재한다고 가정했을 때, dijkstra는 n-1번 반복하지만,\n경로가 존재하지 않을 경우 nullpointer exception이 발생한다.\n따라서 d[]값이 갱신될 경우 (edge가 존재하며 항상 최소 거리일 경우)에만 Priority Queue에 추가하고,\nPQ가 모두 비워질 때까지만 반복해야 한다.</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<h2>알고리즘 :</h2>\n<ol>\n<li>모든 노드의 d[]값을 MAX VALUE로 초기화한다.</li>\n<li>각 노드의 인접한 노드와 가중치를 ArrayList로 생성한다. (nodes배열의 크기는 정점의 개수 n으로 초기화.)</li>\n<li>Priority Queue에 시작 노드와 가중치 0을 추가한다.</li>\n<li>\n<p>PQ가 빌 때까지 while문을 돌면서,</p>\n<ul>\n<li>PQ에서 노드를 꺼냄 : curr</li>\n<li>현재 노드와 인접한 노드들(adj)에 대해 for문을 돌면서, (nodes[] : ArrayList)</li>\n<li>d[인접 노드] > d[현재 노드]+인접 노드의 가중치 이면,</li>\n<li>d[인접 노드] 값을 갱신하고, PQ에 추가한다.</li>\n</ul>\n</li>\n</ol>\n<p><br><br></p>\n<h2>Java Code</h2>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">import</span> <span class=\"token namespace\">java<span class=\"token punctuation\">.</span>util</span><span class=\"token punctuation\">.</span><span class=\"token class-name\">ArrayList</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">java<span class=\"token punctuation\">.</span>util</span><span class=\"token punctuation\">.</span><span class=\"token class-name\">Comparator</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">java<span class=\"token punctuation\">.</span>util</span><span class=\"token punctuation\">.</span><span class=\"token class-name\">PriorityQueue</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">java<span class=\"token punctuation\">.</span>util</span><span class=\"token punctuation\">.</span><span class=\"token class-name\">Scanner</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> node_SP2 <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">int</span> dest<span class=\"token punctuation\">,</span> w<span class=\"token punctuation\">;</span>\n    <span class=\"token function\">node_SP2</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> dest<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> w<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>dest <span class=\"token operator\">=</span> dest<span class=\"token punctuation\">;</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>w <span class=\"token operator\">=</span> w<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Main</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">static</span> <span class=\"token class-name\">Scanner</span> in <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Scanner</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>in<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">static</span> <span class=\"token keyword\">int</span> v<span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">,</span> k<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">static</span> <span class=\"token keyword\">int</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> d <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token keyword\">int</span><span class=\"token punctuation\">[</span><span class=\"token number\">20001</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">static</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span>node_SP2<span class=\"token punctuation\">></span></span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> nodes <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token punctuation\">[</span><span class=\"token number\">20001</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">static</span> <span class=\"token class-name\">PriorityQueue</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span>node_SP2<span class=\"token punctuation\">></span></span> pq <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PriorityQueue</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Comparator</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span>node_SP2<span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token annotation punctuation\">@Override</span>\n        <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> <span class=\"token function\">compare</span><span class=\"token punctuation\">(</span>node_SP2 o1<span class=\"token punctuation\">,</span> node_SP2 o2<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> o1<span class=\"token punctuation\">.</span>w<span class=\"token operator\">-</span>o2<span class=\"token punctuation\">.</span>w<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        v <span class=\"token operator\">=</span> in<span class=\"token punctuation\">.</span><span class=\"token function\">nextInt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> e <span class=\"token operator\">=</span> in<span class=\"token punctuation\">.</span><span class=\"token function\">nextInt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>k<span class=\"token operator\">=</span>in<span class=\"token punctuation\">.</span><span class=\"token function\">nextInt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span>i<span class=\"token operator\">&lt;=</span>v<span class=\"token punctuation\">;</span>i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            nodes<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            d<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token class-name\">Integer</span><span class=\"token punctuation\">.</span>MAX_VALUE<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span>i<span class=\"token operator\">&lt;</span>e<span class=\"token punctuation\">;</span>i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            nodes<span class=\"token punctuation\">[</span>in<span class=\"token punctuation\">.</span><span class=\"token function\">nextInt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token function\">node_SP2</span><span class=\"token punctuation\">(</span>in<span class=\"token punctuation\">.</span><span class=\"token function\">nextInt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> in<span class=\"token punctuation\">.</span><span class=\"token function\">nextInt</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        d<span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n        pq<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token function\">node_SP2</span><span class=\"token punctuation\">(</span>k<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>\n        <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>pq<span class=\"token punctuation\">.</span><span class=\"token function\">isEmpty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            node_SP2 curr <span class=\"token operator\">=</span> pq<span class=\"token punctuation\">.</span><span class=\"token function\">poll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span>node_SP2 adj <span class=\"token operator\">:</span> nodes<span class=\"token punctuation\">[</span>curr<span class=\"token punctuation\">.</span>dest<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>d<span class=\"token punctuation\">[</span>adj<span class=\"token punctuation\">.</span>dest<span class=\"token punctuation\">]</span><span class=\"token operator\">></span>d<span class=\"token punctuation\">[</span>curr<span class=\"token punctuation\">.</span>dest<span class=\"token punctuation\">]</span><span class=\"token operator\">+</span>adj<span class=\"token punctuation\">.</span>w<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    d<span class=\"token punctuation\">[</span>adj<span class=\"token punctuation\">.</span>dest<span class=\"token punctuation\">]</span><span class=\"token operator\">=</span>d<span class=\"token punctuation\">[</span>curr<span class=\"token punctuation\">.</span>dest<span class=\"token punctuation\">]</span><span class=\"token operator\">+</span>adj<span class=\"token punctuation\">.</span>w<span class=\"token punctuation\">;</span>\n                    pq<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token function\">node_SP2</span><span class=\"token punctuation\">(</span>adj<span class=\"token punctuation\">.</span>dest<span class=\"token punctuation\">,</span> d<span class=\"token punctuation\">[</span>adj<span class=\"token punctuation\">.</span>dest<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span>i<span class=\"token operator\">&lt;=</span>v<span class=\"token punctuation\">;</span>i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span>d<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token operator\">==</span><span class=\"token class-name\">Integer</span><span class=\"token punctuation\">.</span>MAX_VALUE<span class=\"token operator\">?</span><span class=\"token string\">\"INF\"</span><span class=\"token operator\">:</span>d<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>","id":"29019e9c-9bfc-571c-b753-236a2afeb4d3","frontmatter":{"title":"[Algorithm] 백준 1753 : 최단 경로 ","date":"2020-03-20T00:00:00.000Z","description":null},"fields":{"slug":"/blog/algorithm/algo_20200320_1/"}}},"pageContext":{"slug":"/blog/algorithm/algo_20200320_1/"}}}