from ABC190 ABC190E E - Magical OrnamentE - Magical Ornament

  • image
  • 辺の数の制約があるので辺が10^5ならダイクストラ使えるを思いつく
  • 高々17頂点なので17回ダイクストラしてC頂点間の距離を求めて巡回セールスマン問題(始点に戻らないタイプ)
  • サンプルはあっさり通ったが、提出すると20AC 5WA 10TLE
    • 厄介だな…
  • WAの原因
    • 到達不能判定をする時にダイクストラの結果にINFが含まれるかで判断してた
    • それは「グラフのいずれかの頂点が到達不能か?」を判定している
    • C頂点が到達可能なら他の頂点はどうでもいい
  • TLEの解決方法が皆目検討つかず時間切れ
  • 公式解説
    • 17回BFSして最短ハミルトン路問題
    • え、じゃあダイクストラではなくBFSしてたら通ったということ?
    • 試したら通った… python
def main():
    N, M = map(int, input().split())
    from collections import defaultdict
    edges = defaultdict(list)
    for _i in range(M):
        frm, to = map(int, input().split())
        edges[frm - 1].append(to - 1)  # -1 for 1-origin vertexes
        edges[to - 1].append(frm - 1)  # if bidirectional

    K = int(input())
    CS = list(int(x) - 1 for x in input().split())

    INF = 9223372036854775807
    dist = []
    for c in CS:
        d = one_to_all_bfs(c, N, edges, INF)
        dd = [d[CS[i]] for i in range(K)]
        if INF in dd:
            print(-1)
            return
        dist.append(dd)

    ret = tsp_not_return(K, dist)
    print(ret + 1)
- コード全体はこちら[AC](https://atcoder.jp/contests/abc190/submissions/19822810)