본문 바로가기

CS/Algorithm

(3)
[알고리즘] Prim's Algorithm (프림 알고리즘) 프림 알고리즘 weight가 있는 undirected graph 에서 MST를 찾는 알고리즘 크루스칼 알고리즘 (krustal algorithm) 과 같은 용도. 상황에 따라 더 효율적인 알고리즘을 선택 작동 방식 임의의 vertex를 선택하여 Tree 생성 (현재 노드가 1개) T에 있는 노드와 T에 없는 노드 사이의 edge 중 weight가 최소인 edge를 찾는다 해당 edge가 연결하는 노드중, Tree에 없던 노드를 Tree에 추가 모든 노드가 Tree에 포함될 때까지 2-3을 반복 코드 구현 from math import inf graph = [ [inf, 10, inf, 5, inf, inf, inf], [10, inf, 2, 7, 12, inf, inf], [inf, 2, inf, inf..
[알고리즘] Kruskal Algorithm(크루스칼 알고리즘) Kruskal Algorithm 네트워크(간선에 가중치가 부여된 그래프)의 모든 edge를 최소 비용으로 연결하는 방법을 Greedy하게 찾는 알고리즘. MST(최소 비용 신장 트리)의 특성을 이용하여 각 단계에서 MST를 구성해나감. 신장 트리 : 그래프에서 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프 최소 신장 트리 : 간선 비용이 최소가 되는 신장트리 동작 방법 간선을 비용을 기준으로 오름차순으로 정렬 모든 간선을 순서대로 하나씩 추가 (사이클을 만드는 간선은 포함하지 않음) union-find 알고리즘을 활용한 사이클 판별 서로소 집합은 무방향 그래프 내의 사이클 존재 여부 판별에 이용됨 (유방향 그래프는 dfs를 활용해 판별) 모든 간선 정보에 대해 find 연산으로 각 노드의 부..
[알고리즘] union-find Algorithm union-find 알고리즘 사이클이 발생하는지 여부를 확인하는 방법 : 노드들의 부모가 같은지 여부를 판단 (부모 노드가 같다면 사이클 발생) 서로소 집합 자료구조 (Disjoint Set) : 서로소 부분 집합들로 나누어진 원소들에 대한 자료구조 (트리가 효율적) 서로 연결된 두 노드 중 값이 작은 노드가 부모 노드가 됨 루트 노드를 집합의 대표값으로 반환 union-find 연산 # find def find(parent, x): if parent[x] != x: return find(parent, x) return x # union def union(parent, a, b): a, b = find(parent, a), find(parent, b) if a > b: parent[a] = b else:..

반응형