n개의 색상이 지정된 노드와 m개의 서로 다른 모서리가 있는 방향 그래프가 있다고 가정합니다. 그리고 노드는 0에서 n-1까지 번호가 매겨집니다. 소문자로 된 문자열 col이 있습니다. 여기서 col[i]는 이 그래프(0-인덱스)에서 i번째 노드의 색상을 나타냅니다. edge[j] =(u, v)가 나타내는 에지 목록도 있으며 u와 v 사이에 에지가 있습니다.
그래프의 유효한 경로는 xi에서 xi+1까지의 방향 간선이 있도록 1에서 k까지의 모든 i에 대한 노드 xi의 시퀀스입니다. 경로의 색상은 해당 경로의 가장 빈번한 노드 색상입니다. 해당 그래프에서 유효한 경로의 가장 큰 색상 값을 찾아야 합니다. 그래프에 주기가 있으면 -1을 반환합니다.
따라서 입력이 col ="aabada" edge =[(0,1),(1,4),(1,2),(2,3),(3,5),(4,5)와 같은 경우 ],

그러면 출력은 0 -> 1 -> 2 -> 3 -> 5가 'a' 색상의 가장 긴 경로를 가지므로 4가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
n:=열 크기
-
graph:=edge list에서 주어진 그래프
-
indegree:=노드와 해당 차수 값을 포함하는 맵
-
대기열:=새 목록
-
dp:=n x 26 크기의 배열을 만들고 0으로 채움
-
colorvalues:=col의 모든 c에 대해 알파벳 c의 순서로 목록을 만듭니다.
-
범위 0에서 n - 1에 있는 u에 대해 수행
-
u가 indegree가 아니면
-
큐 끝에 u 삽입
-
dp[u, 색상값[u]]:=1
-
-
-
방문:=0
-
대기열이 비어 있지 않은 동안 수행
-
u:=대기열의 앞 요소 및 이후 삭제
-
방문 :=방문 + 1
-
그래프[u]의 각 v에 대해 수행
-
0에서 25 사이의 c에 대해 수행
-
dp[v, c] =dp[v, c]의 최대값 및 (dp[u, c] + (c가 colorvalues[v]와 같으면 1, 그렇지 않으면 0)
-
-
차수[v] :=차수[v] - 1
-
indegree[v]가 0과 같으면
-
큐 끝에 v 삽입
-
델 정도[v]
-
-
-
-
-
반환 -1
-
-
dp의 최대 요소를 반환
예
더 나은 이해를 위해 다음 구현을 살펴보겠습니다.
from collections import defaultdict
def solve(col, edges):
n=len(col)
graph=defaultdict(list)
indegree=defaultdict(int)
for u,v in edges:
graph[u].append(v)
indegree[v]+=1
queue=[]
dp=[[0]*26 for _ in range(n)]
colorvalues=[ord(c)-ord("a") for c in col]
for u in range(n):
if u not in indegree:
queue.append(u)
dp[u][colorvalues[u]]=1
visited=0
while queue:
u=queue.pop()
visited+=1
for v in graph[u]:
for c in range(26):
dp[v][c]=max(dp[v][c],dp[u][c] + (c==colorvalues[v]))
indegree[v]-=1
if indegree[v]==0:
queue.append(v)
del indegree[v]
if visited<n:
return -1
return max(max(x) for x in dp)
col = "aabada"
edges = [(0,1),(1,4),(1,2),(2,3),(3,5),(4,5)]
print(solve(col, edges)) 입력
"aabada", [(0,1),(1,4),(1,2),(2,3),(3,5),(4,5)]
출력
4