問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
巡回セールスマン問題とは、都市の集合と各都市間の距離が与えられ、全都市をちょうど1回ずつ訪れたのち出発した都市に戻ってくるような経路 (巡回路) のうち最も短いものを求める問題です。
ここでは、巡回セールスマン問題に対する貪欲法を学習しましょう。このアルゴリズムは発見的解法 (ヒューリスティクス) と呼ばれるもので、ある程度良い解が出力されることが期待されるものの、解の精度は全く保証されません。
巡回セールスマン問題に対する貪欲法の概要は、以下の通りです。
・ 都市を頂点とし、辺を 1 本も含まないグラフ G を用意する
・ 都市のペアを結ぶ辺を全て列挙し、E とする
・ E が空になるまで、以下を繰り返す
・ E に含まれる辺のうち最も長さが短いものを E から削除して e とする
・ G に e を追加したグラフを G' とする。G' のすべての頂点の次数が 2 以下かつ G' に閉路が存在しないなら、G を G' で更新する
・ この時点で G は全都市を結ぶ一本のパスになっている (次数 1 の都市がただ 2 つ存在する) ため、その始点と終点を辺で繋いで巡回路を作る
G' のすべての頂点の次数が 2 以下かつ G' に閉路が存在しない
かどうかを判定する練習をしましょう。G' のすべての都市の次数が 2 以下かつ G' に閉路が存在しない
かどうかを判定してください。n m
a_0 b_0
a_1 b_1
...
a_{m-1} b_{m-1}
ea eb
G に e を追加したグラフ G' について、G' のすべての都市の次数が 2 以下かつ G' に閉路が存在しない
ならばYes
と、そうでないならNo
と出力してください。
すべてのテストケースにおいて、以下の条件をみたします。
・ 入力はすべて整数
・ 4 ≦ n ≦ 3,000
・ 1 ≦ m < n-1
・ 0 ≦ a_i, b_i ≦ n-1 (0 ≦ i ≦ m-1)
・ a_i ≠ b_i (0 ≦ i ≦ m-1)
・ i ≠ j ならば (a_i, b_i) ≠ (a_j, b_j)
・ 0 ≦ ea, eb ≦ n-1
・ (ea, eb) ≠ (a_i, b_i) (0 ≦ i ≦ m-1)
・ n 個の都市と辺 (a_0, b_0), ... , (a_{m-1}, b_{m-1}) からなるグラフについて、すべての頂点の次数が 2 以下かつ閉路を含まない
5 3
4 3
2 0
1 4
0 4
No
5 3
4 3
2 0
1 4
0 1
Yes
5 3
4 3
2 0
1 4
3 1
No