참조 ) 안경잡이개발자 : 네이버 블로그, Geeks for Geeks
‘강한 연결 요소’란?
코사라주 알고리즘
’과 ‘타잔 알고리즘
’이 있다.SCC의 필요 조건
정방향 그래프
, 역방향 그래프
, 스택
세 가지가 필요하다.알고리즘 설명
알고리즘 설명
# 문제조건
- 각 사람이 원하는 '같이 갈 사람'이 주어졌을 때, 버스에 태울 수 있는 '최대 인원'을 구한다.
- 입력은 첫번째 줄에 사람 수 'n'과 태울 수 있는 사람 수 'k'가 주어진다.
- 두번째 줄에 n개의 정수가 차례대로 주어진다. 이 정수는 해당 정수 번호의 사람이 버스에 타지 않는다면, n번째 사람도 버스에 타지 않음을 의미한다.
- 단, 위 조건의 역은 성립하지 않는다. n번째 사람이 타지 않는다고, 정수번째 사람이 타지 않는건 아니다.
그래프는 단방향으로 주어진다. 주어진 서브 그래프들은 ‘SCC’이며, 각각의 SCC 크기를 배열에 넣고 그 중 최대 인원 k보다 작으면서 가장 큰 SCC 크기를 출력한다.
부모값과 현재 노드를 mapping한 리스트를 쓰거나 리스트 두 개로 탐색 상태를 트래킹하고, SCC를 이차원 배열 혹은 딕셔너리에 저장한다.
# 아직 수정 중!
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**8)
n, k = map(int,input().split()) # n은 사람 수, k는 버스에 태울 수 있는 사람의 수이다.
# init tree(graph)
graph = {i : [] for i in range(1, n+1)} #index번째 노드의 연결 관계를 기록한다
r_graph = {i : [] for i in range(1, n+1)} #index번째 노드의 연결 관계를 기록한다 reversed_graph
visited = [False for _ in range(n+1)] # 탐색 여부를 기록하고, True이면 해당 노드의 탐색이 끝나 다시 방문하지 않는다
v = ['' for num in range(n)]
result = [[] for num in range(n)]
idx = []
st = []
SCC = []
global id
id = 0
def dfs(i):
global id
id += 1
idx[i] = id
st.append(i)
parent = idx[i]
for j in range(n+1):
k = v[i][j]
if idx[j] == 0:
parent = min(parent, dfs(k))
elif visited[j] == False:
parent = min(parent, idx(k))
if parent == idx[i]:
scc=[]
while 1:
tmp = st.top()
st.pop()
scc.append(tmp)
visited[tmp] = True
if tmp == i:
break
SCC.append(scc)
return parent
#간선 개수 만큼 그래프 작성
list = input().split()
idx = 1
for n in list:
graph[idx].append(int(n)) # 정방향 그래프
r_graph[int(n)].append(idx) # 역방향 그래프
v[idx-1] += n
idx += 1
print(graph)
print(r_graph)
print(v)
for i in range(int(n)):
if visited[i] == 0 :
dfs(i)
print(SCC)