티스토리 뷰
최소 스패닝 트리 : 간선의 가중치가 있는 그래프의 부분 그래프 중,
사이클이 없으며 가중치의 합이 최소인 부분 그래프
최소 스패닝트리를 만드는데에는 크루스칼이 더 많이 쓰이지만 나는 Priority_queue를 사용하는 프림 알고리즘이 익숙하다.
사이클 체크를 해줄필요도 없이 임의의 노드로 부터 출발하여 그 노드와 인접한 모든 노드를 Priority_queue에 넣어주어서 가장 가까운 위치에 있는 노드를 방문해주면 끝난다.
구현도 간단하고 이름도 이뻐서 애용중,,,
크루스칼과 시간 복잡도도 거의 비슷해서 초록 책에서도 취향대로 가라고 한다.
while(!pq.empty()){
long double dist=pq.top().first;
int dest=pq.top().second;
pq.pop();
if(vis[dest])continue;
vis[dest]=1;
ans+=dist;
for(auto i:adj[dest]){
// 이미 방문하지 않은 노드만 추가시켜서 시간 단축시키기!
if(vis[i.second]==0) pq.push(i);
}
}
'Algorithms & PS' 카테고리의 다른 글
[short] 최소공통조상 알고리즘 (Longest Common Ancestor) (0) | 2021.11.23 |
---|---|
[20040] Union-find로 그래프 상의 사이클 검출 (0) | 2021.11.16 |
[2668] 숫자고르기 (0) | 2021.11.15 |
[22991] 수요응답형 버스 (박제용) (2) | 2021.10.18 |
선분 교차 판별법 (0) | 2021.08.28 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday