米田氏が企画した「競プロ典型90問」を解いていきます。
ここでは私の試行錯誤やら解説の理解やら気づきやらをメモしていこうと思います。
競プロ初心者なのでどうか温かい目で見守ってください。
なお、本記事中のPythonコードはブラウザ上で実行可能です。
よろしければ遊んでいってください。
問題
kyopro_educational_90/003.jpg at main · E869120/kyopro_educational_90
![](data:image/png;base64,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)
003 - Longest Circular Road(★4)
やってみよう!
テストデータ・テスト関数定義 ↓
# 縮小表示
test_data = [
{'in': [3, [[1, 2], [2, 3]]], 'out': 3},
{'in': [5, [[1, 2], [2, 3], [3, 4], [3, 5]]], 'out': 4},
{'in': [10,
[[1, 2], [1, 3], [2, 4], [4, 5], [4, 6], [3, 7], [7, 8], [8, 9],
[8, 10]]],
'out': 8},
{'in': [31,
[[1, 2], [1, 3], [2, 4], [2, 5], [3, 6], [3, 7], [4, 8], [4, 9],
[5, 10], [5, 11], [6, 12], [6, 13], [7, 14], [7, 15], [8, 16], [8, 17],
[9, 18], [9, 19], [10, 20], [10, 21], [11, 22], [11, 23], [12, 24],
[12, 25], [13, 26], [13, 27], [14, 28], [14, 29], [15, 30],
[15, 31]]],
'out': 9},
{'in': [75,
[[1, 51], [3, 70], [8, 22], [6, 11], [13, 22], [14, 54], [15, 22],
[19, 52], [23, 25], [25, 26], [7, 33], [9, 35], [9, 42], [37, 56],
[40, 57], [41, 52], [28, 44], [12, 45], [12, 57], [39, 46], [39, 68],
[47, 61], [29, 48], [6, 29], [50, 65], [18, 52], [43, 54], [16, 43],
[56, 65], [38, 57], [38, 68], [24, 58], [16, 59], [10, 60], [30, 61],
[18, 62], [6, 63], [6, 30], [7, 67], [18, 68], [18, 34], [28, 69],
[28, 51], [5, 70], [5, 21], [55, 72], [22, 55], [20, 73], [36, 74],
[36, 42], [17, 42], [17, 49], [49, 66], [4, 66], [4, 10], [10, 34],
[34, 65], [30, 65], [21, 30], [20, 21], [20, 51], [27, 51], [25, 27],
[25, 31], [2, 31], [2, 53], [53, 71], [22, 71], [22, 64], [24, 64],
[7, 24], [7, 16], [16, 32], [32, 75]]],
'out': 28},
]
def test_all(f):
for i, data in enumerate(test_data):
exp = data["out"]
ans = f(*data["in"])
result = "AC" if exp == ans else "WA"
print(f"{i+1} {result}: expected: {exp}, output: {ans}")
下のmain0
関数を完成させて「Run」ボタンをクリックしよう!
def main0(N, AB):
pass
test_all(main0)
自由欄
try(1st.)
考え方
- 木構造?という言葉は知っていても具体的な考え方やアルゴリズムは知らない…
- とりあえず木構造を作って、末端を2つ繋ぐ組み合わせからスコアが最大になる場合を探すか?
という感じで実装したのが以下
from itertools import combinations
def main1(N, AB):
def route(a, b, passed):
'''aからbまでに通る道の数を返す'''
passed.append(a)
if b in net[a]:
return 1
else:
for branch in net[a]:
if branch in passed:
continue
try:
return 1 + route(branch, b, passed)
except:
pass
else:
raise Exception("Here is wrong way...")
# 各都市から見て繋がっている都市のリスト
net = {i: list() for i in range(1, N+1)}
for a, b in AB:
net[a].append(b)
net[b].append(a)
# print(net)
# 末端の都市を抽出
terminals = [k for k, v in net.items() if len(v) == 1]
# 末端どうしの経路のうち最大を探す
return max([route(*pat, []) for pat in combinations(terminals, 2)]) + 1
テストデータ・テスト関数定義
test_all(main1)
結果(1st.)
あかん…
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPYAAAC+CAYAAAAGGfLJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAACDrSURBVHhe7Z0JvBPV9ccP+yYiICJSQRSV3QWXoqAF1CqCoGgRFbEoFotatFKRRUGEPxZFFKTigmtF2qIiVXGpiqDUBS0goAIKtSggPESWJ4vkn+9hbpgXkrzkveS9ZDjf95nPS+5MMjM393fPuWdm7ikTCiOGYQSKst5/wzAChAnbMAKICdswAogJ2zACiAk7BXbs2CFjx46VCRMmyIYNG7zSgrz00kty0kknydChQ+Wnn37ySg2jZNlH2P/617/k97//vcyePVu2b9/ule6FsokTJ8rLL78sX375pdx2221xG3k2Udzz4uLBrFmzZPr06bJ+/XqpUqWKtyY1fvjhB7nqqqtU/KksfIbPGkYyFBB2Xl6e/PWvf5UPP/xQ/vjHP8p5550nkyZNku+//97bQqRSpUpyzDHHyLRp06R8+fKyc+dOeeutt7y1e/nxxx9l0KBBcvHFF8tXX33llZYOxT0vhH7ttdfKnXfeKa1atZLrr79eOwrev/baa3L++edHBEgZ0Am0bds2Uo4lN4ySooCwa9WqJX/5y1/k3nvvlRNOOEHFOWXKFOnatav8+c9/lm+//Va3Y90hhxyirua5554rK1eu3McKVq5cWcXCOixccdm0aZM8+eST8qc//UmFmgrFPS8+z7lAt27dtKO677775J133tHOoWzZoo1oHn74Yfn444914TW0aNFC3nzzzUj57bffruWGkQpxb1CheN26dfKPf/xDrR3jyyOPPFLGjRsnv/jFL7ytEoN4sIxYyZ49e8rPP/+sovrf//4nX3/9tSxfvlw+++wzFerNN98s7dq1kzJlyuhnEdsLL7wgGzdulFtuuUV27dolw4cPVzENHDhQfvOb30S2/eSTT3SbU045RQYPHiwHHniglseiqOdF58R3L1y4UC367t27ZciQIdKpU6fIcQCWGatNx8A4mw7OD+70gAED9LxTAcGPHz9eDjroIK/EMOITMTXLli2T6667Tp599ln57rvvtKxu3brSv39/+ec//yl9+vSR3r17S/369XVdIrZt26bi3bx5s75/4okn1CU/9dRT5eyzz5bf/va32vjZF0Jh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)
提出 #32367991 - 競プロ典型 90 問
try(2nd.)
route
関数が遅いのか?と考え以下の修正
from itertools import combinations
def main2(N, AB):
dp = dict()
def route(a, b, wrongway=None):
'''aからbまでに通る道の数を返す
wrongwayからaに移動したことを示す。
'''
if (a, b, wrongway) in dp:
return dp[(a, b, wrongway)]
if b in net[a]:
ret = 1
else:
if wrongway is not None:
available = net[a].copy()
available.remove(wrongway)
else:
available = net[a]
for way in available:
ret = 1 + route(way, b, a)
if ret != 0:
break
else:
ret = -1
dp[(a, b, wrongway)] = ret
return ret
# 各都市から見て繋がっている都市のリスト
net = {i: list() for i in range(1, N+1)}
for a, b in AB:
net[a].append(b)
net[b].append(a)
# print(net)
# 末端の都市を抽出
terminals = [k for k, v in net.items() if len(v) == 1]
# 末端どうしの経路のうち最大を探す
return max([route(*pat) for pat in combinations(terminals, 2)]) + 1
test_all(main2)
結果(2nd.)
ACが2個増えた…😇
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPcAAAC7CAYAAAC5FghEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAACCPSURBVHhe7Z0JmBTV1YYvOOwCAspqxAWjsrkgKCAiolFZBEWDGgXD4o9RCRCJyOKDC0hECJtERQiKEYnBgBrFuCKbUVFBFmVRUEHWQdYBRPrv91C3rempnpmeqZ7urjnvPPV0963qrqo797vn3FNV95QIhTGKogSOks6roigBQ8WtKAFFxR0nhw8fNqNHjzYTJ040O3fudEqz88orr5gLL7zQDB061Bw8eNApVZSixVPc77zzjvnDH/5g5s+fbw4dOuSU/gJlkyZNMv/5z3/MmjVrzP333x+zoacShT0vwhPz5s0zs2fPNjt27DDlypVz1sTHjz/+aG6//XbpAOJZ+A7fVZT8kEPcmZmZ5h//+If56KOPzJ/+9CdzzTXXmMmTJ5vt27c7WxhTpkwZ8+tf/9rMmjXLZGRkmJ9++sm8++67ztpf2LNnjxk0aJC54YYbzNdff+2UJofCnhdiv+OOO8xDDz1kGjdubO6++27pLPj85ptvmvbt20dESBnQEVxyySWRciy6ohQVOcRdtWpV87e//c2MGTPGnH/++SLQadOmmU6dOpnHHnvMbN68WbZjXfXq1cXtvPrqq82GDRtyWMOyZcuKYFiHpSssu3fvNs8++6z585//LGKNh8KeF9/nXKBz587SWf31r38177//vnQQJUsWbITz9NNPm08++UQW3kPDhg3N22+/HSl/4IEHpFxR4iHXS2Gs2rZtm/nXv/4lVo/x5umnn27Gjh1rTj75ZGer3EFAWEis5c0332x+/vlnEdb3339vvvnmG7Nu3TqzYsUKEeuAAQNMq1atTIkSJeS7CO7f//632bVrl7n33nvNkSNHzPDhw0VQAwcONL/97W8j23766aeyTbNmzczgwYNNpUqVpNyLgp4XHRS/vXz5crHsR48eNUOGDDHt2rWLHAdgobHedA6Mu+nk3OBa9+vXT847HhD9uHHjzAknnOCUKEpsspmbtWvXmjvvvNO88MIL5ocffpCyGjVqmLvuusu89tprpkePHqZ79+6mTp06si43Dhw4IALeu3evfJ4+fbq45xdddJG58sorze9//3sRAPtCLGyL0N0i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s+4058l17ugO0evKQlrCvMZHjx4NrV+/nrd5ErZ6oe7du4eGDBkSysrKkrKwcEMzZ84MLV26NBTuBUNh8co2bGvXUzZ37lz5zHZ8ptz+nt2ebfiNsKsj28KmTZtCYVGFwtbcKclJeIwU6tatm7xa+C1+131cduH42R+vfGYb+x0+88pv8T17rhwvn937iEV+6zORUIf2f5BKpELdxIL6cre9dID6RMPRlHBepZfXuaT9g4CM1qc3Wjf+Qn3ifei85YpSTFBxK0pAUXErSkBRcStKQFFxK0pAUXErSkBRcStKQFFxK0pAUXErSkBRcStKQFFxK0pAyXZvuaIo6YnXveXZxB0995hScJgAQevTG60bf6E+9cERRSlGqLgVJaCouBUloKi4FSWgqLgVJaCouBUloKi4FSWgqLgVJaCouBUloKi4FSWgJP32U7KRDBw40Jx//vmSU9vN5MmTzfPPP2+eeOIJWZ9OxHOL5c6DO81zXz1nVmauNKHwn9+UCP81qNrAdDurm6lWtppTmjwKcvtpcaujeEjZ209JorZz507Trl07pyRv6BDIi9yiRYs8F7aLleYoVaDRrshckZBGC/wuv89+0hWto/hJmrhJ9EeeppEjR5oePXpIWa9evSSnthUmVhvuuusu+UyeJ5IHWsjn9O6775rFixebwYMHSxlWns+vv/66adCggZSlOlijosDv/dj/IR5WoknXOrJQR9RVdIJLC4kuo9t3YUmq5bYJ2LDcI0aMMJUrVzZt27YVcbLceuutst4KlsR3p556qpQBSflIDojw6STAdgR4AitXFk2DKCyJskbR+L2fadOmmT179jifEku61pHtAK2h8oLEg7Rbv0mauMmg2L17dxHwU089JWXDhg2La2wdFMudFy1rtzRT2k4xE1pPMPWrZs/Y2atBLzPjqhmRxWubvKABRg9d+BzLygANctu2baZ58+ZOSfIZdOEgqQPqxA31Qb246yl6m3jYsmWL8+4YXvUHlJF5tXr16tIuvcCiz50718ycOTNi7PwiJaLlNWvWlGAagTXcctwTL7c8N7cmyLSq3UpeK5auaFrUaiHvgcbc+uTWZv73881tb95mHv34USm/9vRjOdHzC+mRGRpZl5BXPmOZvcCFpEH269dPUh2nAnSAZ1Q+w+z7aZ9pfGLjSAdHef/z+8t76od6or4uqnmRrIsX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)
提出 #32370200 - 競プロ典型 90 問
解説
手詰まりなので解説を見てみましょう。
![](https://github.com/E869120/kyopro_educational_90/blob/main/editorial/003.jpg?raw=true)
kyopro_educational_90/003.jpg at main · E869120/kyopro_educational_90
twitter
ふむふむ。木の直径、完全に理解した!
try(3rd.)
def main3(N, AB):
dp = dict()
def route(a, b, wrongway=None):
'''aからbまでに通る道の数を返す
wrongwayからaに移動したことを示す。
'''
if (a, b, wrongway) in dp:
return dp[(a, b, wrongway)]
if b in net[a]:
ret = 1
else:
if wrongway is not None:
available = net[a].copy()
available.remove(wrongway)
else:
available = net[a]
for way in available:
ret = 1 + route(way, b, a)
if ret != 0:
break
else:
ret = -1
dp[(a, b, wrongway)] = ret
return ret
# 各都市から見て繋がっている都市のリスト
net = {i: list() for i in range(1, N+1)}
for a, b in AB:
net[a].append(b)
net[b].append(a)
# print(net)
# 末端の都市を抽出
terminals = [k for k, v in net.items() if len(v) == 1]
# 1つの末端から、最大経路の末端を探す
one_end = None
w_routes = 0
for term in terminals[1:]:
r = route(terminals[0], term)
if r > w_routes:
w_routes = r
one_end = term
# 見つけた末端から最大経路の末端を探す
terminals.remove(one_end)
return max([route(one_end, term) for term in terminals]) + 1
test_all(main3)
結果(3rd.)
あかんやんけ!
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPQAAAC+CAYAAAAC7CL0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAB8wSURBVHhe7Z0JnBTVtYcvwy6gMqiARHAH2VxQRFGfiAsSDEYwuAEGRDGiIUaUMKAiQkgURATEBVwwGjQoiFGMCyIgbiggy3uyiBpQdkeEYUakX3+Huk3RUz3TPVO9FefjVz+6b1XXcuf+7zn3VNU9FUJhjKIogSDH+V9RlACgglaUAKGCjpOioiLzwAMPmEceecRs2bLFKd2fV1991Zx++ulm8ODBZteuXU6poqSO/QT9zjvvmD/84Q9mzpw5prCw0CndB2Xjxo0z//73v82XX35p/vKXv8Rs3JlEea+LMMOsWbPMtGnTzObNm0316tWdNYnxww8/mOuvv15En8jCb/itopRGRNBbt241//jHP8zHH39s/vznP5tLL73UTJgwwWzatMnZwpiqVauaE0880UydOtVUqlTJ/Pzzz+bdd9911u7jxx9/NAMHDjRdu3Y1a9ascUrTQ3mvC4HfeOON5r777jMtW7Y0/fr1kw6C72+++ab59a9/HREeZYD4zznnnEg5lltRUkFE0Lm5uebRRx81o0aNMqeeeqqIcvLkyaZz587m73//u1m/fr1sx7ojjjhCXMoOHTqYtWvXFrN61apVE5GwDotWXvLz880zzzxj7rzzThFoIpT3uvg91wKXX365dFAPPfSQee+996RTyMkp26jl8ccfN59++qksfIbmzZubt99+O1J+9913S7mixIvnbSuKNm7caP71r3+JdWP8eOyxx5rRo0ebX/3qV85WJYNosIRYxauvvtr88ssvIqb//ve/5quvvjKrVq0yS5cuFYHefvvt5txzzzUVKlSQ3yKyV155xWzbts3ccccdZvfu3ebee+8VEQ0YMMD87ne/i2z72WefyTatW7c2gwYNMgcffLCUe1HW66JTYt9LliwRC75nzx6Tl5dnOnbsGDkPwBJjpekQGEfTsbnBbe7fv79cdyIg9DFjxphDDz3UKVEUb8S8rFy50tx8883m+eefN999952sqFu3rrnlllvMa6+9Znr16mV69uxpGjRoIOtKYufOnSLa7du3y/enn35aXO8zzzzTXHTRReb3v/+9NHqOhUDYFnG7hYFF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)
提出 #32438989 - 競プロ典型 90 問
try(4th.)
やっぱりroute
関数があかんっぽいので想定コードを見てみます。
幅優先探索(BFS)で最短距離を計算するとのこと。
あーあれね、はいはい、幅を優先する探索ね。
幅優先探索
しったかぶっても始まらないので以下参照
幅優先探索、完全に理解した
実装
from collections import deque
import operator
ig = operator.itemgetter
def main4(N, AB):
def bfs(start):
'''startから最短距離が最大の都市と距離を返す'''
q = deque([start])
passed = {start: 0}
while len(q):
n = q.popleft()
for dest in tree[n]:
if not dest in passed:
q.append(dest)
passed[dest] = passed[n] + 1
return max(passed.items(), key=ig(1))
tree = {i:list() for i in range(1, N+1)}
for a, b in AB:
tree[a].append(b)
tree[b].append(a)
end1, _ = bfs(1)
_, ans = bfs(end1)
return ans + 1
test_all(main4)
結果(4th.)
無事ACとなりました。
提出 #32455958 - 競プロ典型 90 問
まとめ
- 2回目の
route
関数でメモ化を行ったが、引数がroute(出発点、目的点)
というかたちのため「一つの出発点から複数の目的点の最短経路を列挙する」というケースには適さなかった?
- でも「複数の出発点から一つの目的点までの最短経路を列挙する」にしても、目的点からの最短経路を幅優先探索すればいいだけだし、結局コーディングのレベルとアルゴリズムの知識が不足してるってことか…
地道に勉強して武器を増やしていこうと思います。
自由欄