LC 2608. 图中的最短环

https://leetcode.cn/problems/shortest-cycle-in-a-graph/

这题想了很久,原来突破口在于固定一条边。

假设我们固定了(x, y)边的话,那么其实我们就需要寻找另外一条x/y之间的通路,但是这条通路不能使用(x,y)这条边

那这个问题就相当是BFS,但是遍历的时候需要避开某些边。

class Solution:
    def findShortestCycle(self, n: int, edges: List[List[int]]) -> int:

        adj = [[] for _ in range(n)]
        for x, y in edges:
            adj[x].append(y)
            adj[y].append(x)

        INF = 1 << 30

        def bfs(src, dst):
            from collections import deque
            dq = deque()
            depth = [-1] * n
            dq.append(src)
            depth[src] = 0
            while dq:
                x = dq.popleft()
                if x == dst:
                    return depth[x] + 1
                for y in adj[x]:
                    if depth[y] != -1: continue
                    # exclude this edge.
                    if (x, y) == (src, dst) or (y, x) == (src, dst): continue
                    depth[y] = depth[x] + 1
                    dq.append(y)
            return INF

        ans = INF
        for (src, dst) in edges:
            r = bfs(src, dst)
            ans = min(ans, r)
        if ans == INF: ans = -1

        return ans