Skip to content

Instantly share code, notes, and snippets.

@Mossuru777
Last active February 18, 2026 15:44
Show Gist options
  • Select an option

  • Save Mossuru777/c4a90fb55de23217a9794b251e91127c to your computer and use it in GitHub Desktop.

Select an option

Save Mossuru777/c4a90fb55de23217a9794b251e91127c to your computer and use it in GitHub Desktop.
ダイクストラアルゴリズム Python実装習作
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"is_executing": false,
"name": "#%% md\n"
}
},
"source": [
"# ダイクストラアルゴリズム Python実装習作\n",
"***\n",
"## ダイクストラアルゴリズム実装部"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"pycharm": {
"is_executing": false,
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"import math\n",
"from collections import defaultdict\n",
"\n",
"from IPython.display import Image, display, display_jpeg, display_png, display_markdown\n",
"\n",
"def dijkstra(n_node, adjacent_node_edge):\n",
" \"\"\"\n",
" ダイクストラアルゴリズムにより、最短経路探索を行います\n",
" なお、この実装では無向グラフを想定しています\n",
" \n",
" Parameters\n",
" ----------\n",
" n_node: int\n",
" ノード数\n",
" adjacent_node_edge: Tuple[int, int, int]\n",
" 隣接ノード間辺タプル(NodeA-index, NodeB-index, length)のリスト\n",
" \n",
" Returns\n",
" -------\n",
" Tuple[List[List[int]], List[List[int]]]\n",
" 最短経路グラフの2次元リスト, ノード間経路 前ノードindexの2次元リストの2次元リスト \n",
" \"\"\"\n",
" \n",
" # 異なるノード間をmath.inf、同じノード間を0の長さとする、\n",
" # 最短経路グラフの2次元リストを作成\n",
" graph = [[math.inf if i != j else 0 for j in range(n_node)] for i in range(n_node)]\n",
"\n",
" # ノード間経路 前ノードindexの2次元リストをNoneで埋めて作成\n",
" prev = [[None for _ in range(n_node)] for _ in range(n_node)]\n",
"\n",
" # 隣接ノード間辺タプルのリストから隣接ノード辞書を作成し、\n",
" # 最短経路グラフおよびノード間経路 前ノードindexをセット\n",
" adj_node = defaultdict(set) # key: NodeA index, value: [NodeAに隣接するノードのindex, ...] \n",
" for a, b, length in adjacent_node_edge:\n",
" graph[a][b] = graph[b][a] = length\n",
" prev[a][b] = a\n",
" prev[b][a] = b\n",
" adj_node[a].add(b)\n",
" adj_node[b].add(a)\n",
" \n",
" # 全てのノードを起点とするループ\n",
" for start in range(n_node):\n",
" # スタートノードから全てのノードへの辺を取得し、\n",
" # 辺の長さが短い順に並び替え、その順の訪問ノードindexリストを作成\n",
" via_node = sorted(range(n_node), key=lambda x: graph[start][x])\n",
" \n",
" # 訪問ノードindexリストの順にループ\n",
" for via in via_node:\n",
" # 訪問ノードが隣接するノードの順不同のループ\n",
" for via_adj in adj_node[via]:\n",
" # もし、start->via->via_adjの経路長がstart->via_adjよりも短い場合に、\n",
" # start->via_adjを更新する\n",
" tmp_length = graph[start][via] + graph[via][via_adj]\n",
" if tmp_length < graph[start][via_adj]:\n",
" graph[start][via_adj] = graph[via_adj][start] = tmp_length\n",
" prev[start][via_adj] = prev[via_adj][start] = via\n",
" \n",
" return graph, prev\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"pycharm": {
"is_executing": false,
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/markdown": [
"## グラフ1"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/markdown": [
"### (ノードはs,v1,v2,v3,v4,tの順に、0~5のIndexを使用)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display_markdown(\"## グラフ1\", raw=True)\n",
"display_markdown(\"### (ノードはs,v1,v2,v3,v4,tの順に、0~5のIndexを使用)\", raw=True)\n",
"display_png(Image(\"./dijkstra/dijkstra_graph01.png\"))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"pycharm": {
"is_executing": false,
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/markdown": [
"### 距離"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[[0, 2, 4, 8, 9, 10],\n",
" [2, 0, 2, 6, 7, 8],\n",
" [4, 2, 0, 4, 5, 6],\n",
" [8, 6, 4, 0, 4, 3],\n",
" [9, 7, 5, 4, 0, 1],\n",
" [10, 8, 6, 3, 1, 0]]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/markdown": [
"### 経路の前のノードIndex"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[[None, 0, 1, 2, 2, 4],\n",
" [1, None, 1, 2, 2, 4],\n",
" [1, 2, None, 2, 2, 4],\n",
" [2, 2, 3, None, 5, 3],\n",
" [2, 2, 4, 5, None, 4],\n",
" [4, 4, 4, 5, 5, None]]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"n = 6 # ノード数\n",
"cost = [ # 隣接ノード間長タプルのリスト (NodeA-index, NodeB-index, length)\n",
" (0, 1, 2),\n",
" (0, 2, 10),\n",
" (1, 2, 2),\n",
" (1, 3, 7),\n",
" (1, 4, 8),\n",
" (2, 3, 4),\n",
" (2, 4, 5),\n",
" (3, 5, 3),\n",
" (4, 5, 1)\n",
"]\n",
"distance, previous = dijkstra(n, cost)\n",
"\n",
"display_markdown(\"### 距離\", raw=True)\n",
"display(distance)\n",
"\n",
"display_markdown(\"### 経路の前のノードIndex\", raw=True)\n",
"display(previous)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"***\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"pycharm": {
"is_executing": false,
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/markdown": [
"## グラフ2"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/markdown": [
"### (ノードはs,A,B,C,D,E,F,tの順に、0~7のIndexを使用)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display_markdown(\"## グラフ2\", raw=True)\n",
"display_markdown(\"### (ノードはs,A,B,C,D,E,F,tの順に、0~7のIndexを使用)\", raw=True)\n",
"display_png(Image(\"./dijkstra/dijkstra_graph02.png\"))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"pycharm": {
"is_executing": false,
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/markdown": [
"### 距離"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[[0, 1, 2, 4, 6, 2, 5, 7],\n",
" [1, 0, 3, 3, 5, 1, 4, 6],\n",
" [2, 3, 0, 5, 5, 4, 4, 6],\n",
" [4, 3, 5, 0, 7, 2, 1, 3],\n",
" [6, 5, 5, 7, 0, 6, 6, 4],\n",
" [2, 1, 4, 2, 6, 0, 3, 5],\n",
" [5, 4, 4, 1, 6, 3, 0, 2],\n",
" [7, 6, 6, 3, 4, 5, 2, 0]]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/markdown": [
"### 経路の前のノードIndex"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[[None, 0, 0, 5, 1, 1, 3, 3],\n",
" [1, None, 0, 5, 1, 1, 3, 6],\n",
" [2, 0, None, 6, 2, 1, 2, 6],\n",
" [5, 5, 6, None, 7, 3, 3, 6],\n",
" [1, 4, 4, 7, None, 1, 7, 4],\n",
" [1, 5, 1, 5, 1, None, 3, 6],\n",
" [3, 3, 6, 6, 7, 3, None, 6],\n",
" [3, 6, 6, 6, 7, 6, 7, None]]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"n = 8 # ノード数\n",
"cost = [ # 隣接ノード間長タプルのリスト (NodeA-index, NodeB-index, length)\n",
" (0, 1, 1),\n",
" (0, 2, 2),\n",
" (0, 3, 5),\n",
" (1, 4, 5),\n",
" (1, 5, 1),\n",
" (2, 4, 5),\n",
" (2, 5, 7),\n",
" (2, 6, 4),\n",
" (3, 5, 2),\n",
" (3, 6, 1),\n",
" (4, 7, 4),\n",
" (5, 7, 9),\n",
" (6, 7, 2)\n",
"]\n",
"distance, previous = dijkstra(n, cost)\n",
"\n",
"display_markdown(\"### 距離\", raw=True)\n",
"display(distance)\n",
"\n",
"display_markdown(\"### 経路の前のノードIndex\", raw=True)\n",
"display(previous)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"***\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"pycharm": {
"is_executing": false,
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/markdown": [
"## グラフ3"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/markdown": [
"### (ノードはs,v1,v2,v3,v4,tの順に、0~5のIndexを使用)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/jpeg": "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igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqsNPtBqR1H7PH9sMXkmbHzbM5259M067u4bG0lurh9kMSlnb0ArhtT8a6zqUSjwppZuI5GAW7kHyj14oA9Aorzl/EXjbQb24XU9Kj1K1WESJLbDbg9xVn+2NT8d6Raz+FNfi0eeNj9qjmtVmb2GD0xzQBl/CH/kM+O/8AsOSfzNeo15T4f+G3jPw7fXdxZ+NLYC+uvtN2p05T5rE89TxnnpXq1ABRRRQAUUUUAFFFFABRRRQAUUUZFAHnXxR+HN34+SxW2vo7YW5JYOCc5rlrf4TeObS2jt7fxiI4Y12oiggAV7dketJketAHCeBPCPiPw7e3Euta9/aMciYRMH5T6813lVp9Qs7Z9k91DGx5w7gGo/7Y03/n/t/+/goAu0VR/tjTf+f+3/7+Cj+2dM/5/wC3/wC/goAvUVzV94+8NacszXGpxAQkB8HPWsv/AIW74L/6Cy/980AdzRXGf8LS8Kf8/wA//fs06f4laBFbySI1xIyqSFER+b2oA7GivKNR+N1raNEINDvp965YhMbfamWXxplvxKbfwxfHygC+7jqcUAetUV53Z/EXV79pFg8K3RMZw2WxUF/4w8bGZvsPhgrH5JC72yRJ2P0oA9LorxMeKvi/n/kA2v8A3zW/FefE2SO6Zo7FDDErxjy/9Yx6r+FAHptcX4/uZbpNP8M28slvPrEhjFwv8CqMt+YqC1j+Ik9rHLJd6dE7LkoYvu1xx0fxBo3xU8PX3iPWlu4rqaXyo84SI7egoA9U8PeGtO8NaZFZWMCqEHLkfMx9Sau32mWWpW0lveW0U0Ugw6so5q3RQB55oa6h4b8eXGjNMn9jzx+ZbqePL/2Qa9Drz3xldzX3jLRNGtbZneOQXEkgP3Vr0KgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOM8Z3cl9qOm+GLdik16TLIT90xL95fxrq7KzgsLSO2toliiQYCqMCuD8aXjaN8QPDe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4WOS8mVEXuea7TQdMj0bQrLToWLR28SopPfivL/El3H4h+M2m6Df2KS2tmvmq/Od3XmvYAAAAOgoAWiiigAooooAKKKKACiiigAooooAKKKKAOf8SeDtJ8TRk3kAFwEKpMvDLXDWHiLWvh15un+ILWe70qJgIb5BkKpP8Ves1BeWdvf2klrdRLLBKpV0cZBFABZ3lvqFnFd2sqywSqGR1OQQanryh9I8TfDMXk+ghNR8Pb/MFnKSZIAT82z2rtfDPjXRvFEK/YbpftIXMlu3DofQigDoqKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoorA8SeMdF8LWskuo3aLIqblgU5d/YCgCz4i8R6f4Y0qTUNRmEcS9B3Y+grzSOXUPi9qEbKJbTwvCwZgeDcH0+lXfD/hrUfHWqr4o8WRmO0HNjph+6i9mYdzXp9vbQWkKw28KRRr0RFwBQA2zsrfT7SK1tYlihiUKiqMACp6KKACiiigAooooAKKKKACkPQ0tIehoA8p+FbSf8Jb4vX7M4i+2kifsx9K9XryT4VvCfG3i5BdzGcXRLW5H7tRnhh7163QAUUUUAFFFFABXE/ELwu2q6cmo6fbhtVtGEkbDgkDtXbUUAcr4I8ZW3inT2QjydQtvkubduGQjjOPSuqrzLx3otx4f12x8a6HYebJbMf7QiiYgzREYzgdSOtdx4f8AEOn+JdKi1DTphJG45Xup9CPWgDVooooAKKKKACiml1U4LAH3NKCGGQQR7UALRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRWJ4xlaDwdq0iSGN1tn2sDgg4oA4rwHdXGu+O9e1W4sfLjjfyYpCODjjg16hXB/CLSr7SfAtul+waWZjKCGzkH1rvKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBGVXUqwBUjBB715t4m+G620ra54U/0PVom80qp+WX1U16VRQB554L+I8mrX7aP4gs20zVQMxxyDAkX1Feh5z0rn/Evg3R/FKxtqELCeHPlTxNtdPxFcNp2v638ObmbTPEMVzqGjp81vfxruZF9GoA9ZoqppupWmr6fDfWM6zW8yhkdTnNW6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo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6816bRQB5boXjnx0Gl/t3wbKVwPLNqwH55qS7+MlvpmprYal4c1S2lJG4lQwUHvxXp1QS2VrO++W3idvVkBNAHIWHxT8N3iyF5Z7fY2AJIW+b3HFTv8AE7wjGSJNVVCBkhkYYH5V0n9mWH/PnB/3wKzb7wdoOovM9zp0LNMgR/l6gUAZP/C1/BP/AEHYPyNH/C1/BP8A0HYPyNRf8Kk8Gf8AQIio/wCFSeDP+gRFQBL/AMLX8E/9B2D8jSr8VPBjnCa3CxAydqk/0qH/AIVJ4M/6BEVWbL4ZeE7CR5LfSolZ02HjtQBIvxI8LMoZdRLKehETYP6Vys3xy0xdRe0g0LVLjEmxHVMB/cV6Nb6JpltAkMVlAEQYA2CpRptipBFpCCOhCCgDhNT8eeJm05zpXgy9+1EfuzOw2/jiq2kal8U9asJZZbHStNbJRUm3bun3hivTqKAPK9J8DePZrqT+3fGcy2zKcLacHP49q0tJ+DvhuwjnW9+0am0zbma6kJx+VehUUAYWjeDfD2gJIum6VbQCQ5bCA5/OttI0jXbGioo6BRgU6igArxLx7qvi27+K9r4a0DWnsVntw4B+6DySa9t7V87eJNG8ceIfi019p1nJZNBmKC6Iwu0d8++aAOnt/BXxVS5jaXxlE0YYFhzyK9egV0gjWRt0gUBm9TXhGoz/ABK8Dz2uqapqAvbESATKpyFHqa9w0vUIdU0y3vreRZIpkDBlPFAFuiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKCcDJ7VDbXcF2rNBIsiqdpKnoaAJqKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKADtXnOlfEyaX4iXPhTVtMNm5J+yyg/6wDufTivRq4nxl8N9O8VyteiR7XVNoWO6Q4KgUAYXxo8U6ZaeFptE80y6heALHFFyfxrqPhtaXFj8PtHt7qFopkh+ZGHI5rE8MfCPS9HnjvdSmfUr6NspNMc4r0UAAAAYAoAWiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooACMjBqKC1gtVZYIljVjuIUYyaKKAJaKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display_markdown(\"## グラフ3\", raw=True)\n",
"display_markdown(\"### (ノードはs,v1,v2,v3,v4,tの順に、0~5のIndexを使用)\", raw=True)\n",
"display_jpeg(Image(\"./dijkstra/dijkstra_graph03.jpg\"))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"pycharm": {
"is_executing": false,
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/markdown": [
"### 距離"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[[0, 1, 4, 5, 3, 6],\n",
" [1, 0, 3, 4, 2, 5],\n",
" [4, 3, 0, 1, 4, 2],\n",
" [5, 4, 1, 0, 3, 1],\n",
" [3, 2, 4, 3, 0, 3],\n",
" [6, 5, 2, 1, 3, 0]]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/markdown": [
"### 経路の前のノードIndex"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[[None, 0, 0, 2, 1, 3],\n",
" [1, None, 1, 2, 1, 4],\n",
" [2, 2, None, 2, 3, 3],\n",
" [2, 2, 3, None, 3, 3],\n",
" [1, 4, 3, 4, None, 4],\n",
" [3, 4, 3, 5, 5, None]]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"n = 6 # ノード数\n",
"cost = [ # 隣接ノード間長タプルのリスト (NodeA-index, NodeB-index, length)\n",
" (0, 1, 1),\n",
" (0, 2, 4),\n",
" (1, 2, 3),\n",
" (1, 3, 6),\n",
" (1, 4, 2),\n",
" (2, 3, 1),\n",
" (2, 5, 5),\n",
" (3, 4, 3),\n",
" (3, 5, 1),\n",
" (4, 5, 3)\n",
"]\n",
"distance, previous = dijkstra(n, cost)\n",
"\n",
"display_markdown(\"### 距離\", raw=True)\n",
"display(distance)\n",
"\n",
"display_markdown(\"### 経路の前のノードIndex\", raw=True)\n",
"display(previous)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.5"
},
"pycharm": {
"stem_cell": {
"cell_type": "raw",
"metadata": {
"collapsed": false
},
"source": []
}
}
},
"nbformat": 4,
"nbformat_minor": 1
}
@Mossuru777
Copy link
Author

変数名・コメントなどを整備して更新

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment