Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 색상을 번갈아 사용하는 최단 경로


0, 1, ..., n-1로 레이블이 지정된 노드가 있는 방향 그래프가 있다고 가정합니다. 이 그래프에서 각 모서리는 빨간색 또는 파란색으로 표시되며 자체 모서리 또는 평행 모서리가 있을 수 있습니다. red_edges의 각 [i, j]는 노드 i에서 노드 j까지의 빨간색 방향 에지를 나타냅니다. 마찬가지로, blue_edges의 각 [i, j]는 노드 i에서 노드 j까지의 파란색 방향 에지를 나타냅니다. 우리는 길이가 n인 배열 응답을 찾아야 합니다. 여기서 각 응답[X]은 노드 0에서 노드 X까지의 최단 경로 길이이므로 가장자리 색상이 경로를 따라 번갈아가며(또는 그러한 경로가 그렇지 않은 경우 -1) 존재).

따라서 입력이 n =3, red_edges =[[0,1],[1,2]] 및 blue_edges =[]인 경우 출력은 [0, 1, -1]

이 문제를 해결하기 위해 다음 단계를 따릅니다.

  • bfs()라는 메서드를 정의하면 re, be, f 및 n

    이 필요합니다.
  • 방문이라는 집합을 정의하고 대기열을 정의하고 삼중항 [0, f, 0]

    을 삽입합니다.
  • q가 비어 있지 않은 동안

    • 삼중항 전류, 색상, 단계를 q[0]으로 설정하고 q에서 삭제

    • color :=color 값을 보완(true와 false, 그 반대)

    • res[current] :=res[current] 및 단계의 최소값

    • 색상이 0이 아닌 경우

      • re[current]

        의 각 i에 대해
        • 쌍(i, color)이 방문되지 않은 경우 방문에 (i, color)를 삽입하고 q

          에 [i, color, step + 1]을 삽입합니다.
    • 그렇지 않으면 색상이 0이면

      • be[current]

        의 각 i에 대해
        • 쌍(i, color)이 방문되지 않은 경우 방문에 (i, color)를 삽입하고 q

          에 [i, color, step + 1]을 삽입합니다.
  • 주요 방법 -

  • res :=무한대 값의 배열이고 크기는 n

  • re 및 be :=n개의 빈 배열로 구성된 배열

  • r의 각 요소 i에 대해:i[1]을 re[i[0]]

    에 삽입
  • b의 각 요소 i에 대해:i[1]을 be[i[0]]

    에 삽입
  • bfs(re, be, false, n) 호출 및 bfs(re, be, true, n) 호출

  • 범위 0에서 res의 길이 – 1까지의 i에 대해

    • res[i] =inf이면 res[i] :=-1

  • 반환 해상도

예제(파이썬)

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

class Solution(object):def shortestAlternatingPaths(self, n, r, b):self.res =[float("inf")] * n re =[[] for i in range(n) ] be =[[] for i in range(n) ] for i in r:re[i[0]].append(i[1]) for i in b:be[i[0]].append(i[1] ) self.bfs(re,be,False,n) self.bfs(re,be,True,n) for i in range(len(self.res)):if self.res[i] ==float(' inf'):self.res[i]=-1 return self.res def bfs(self,re,be,f,n):방문 =set() queue =[[0,f,0]] while queue:current,color,step =queue[0] queue.pop(0) color =not color self.res[current] =min(self.res[current],step) if color:for i in re[current]:if (i,color) 방문하지 않음:Visited.add((i,color)) queue.append([i,color,step+1]) elif not color:for i in be[current]:if (i,color ) 방문하지 않음:Visited.add((i,col 또는)) queue.append([i,color,step+1])ob =Solution()print(ob.shortestAlternatingPaths(3, [[0,1], [1,2]], [])) 

입력

3[[0,1],[1,2]][]

출력

[0,1,-1]