ABC 142 F - Pure【Python】

問題はこちら。

最少の長さの閉路を求めればよい。多重辺のない有向グラフなのでe = (a, b)とすればbから出発してaに戻る最小パスをBFSで求めれば、eを含むループの中で最小のものが求められる。このようなループをeについて全て求め最小の閉路の長さを見つける。最後に最小ループを再構築する。

import sys
from collections import deque
readline = sys.stdin.readline


def main():
 N, M = map(int, readline().split())
 G = [[] for _ in range(N)]
 E = []
 for _ in range(M):
   a, b = map(int, readline().split())
   a -= 1; b -= 1
   G[a].append(b)
   E.append((a, b))

 e = None
 min_ = N + 1
 for a, b in E:
   prev = [-1] * N
   q = deque([b])
   prev[b] = a
   while q:
     x = q.popleft()
     for y in G[x]:
       if prev[y] >= 0:
         continue
       prev[y] = x
       q.append(y)
   if prev[a] == -1:
     continue
   tmp = 1
   p = prev[a]
   while p != a:
     tmp += 1
     p = prev[p]
   if min_ > tmp:
     min_ = tmp
     e = (a, b)

 if min_ == N + 1:
   print(-1)
   return

 a, b = e
 prev = [-1] * N
 q = deque([b])
 prev[b] = a
 while q:
   x = q.popleft()
   for y in G[x]:
     if prev[y] >= 0:
       continue
     prev[y] = x
     q.append(y)

 ans = [a]
 p = prev[a]
 while p != a:
   ans.append(p)
   p = prev[p]
 print(len(ans))
 for x in ans:
   print(x + 1)


if __name__ == '__main__':
 main()

この記事が気に入ったらサポートをしてみませんか?