-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
5-dhlee777 #21
5-dhlee777 #21
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
최소 신장 트리 되게 오랜만에 보네요!
union find가 되게 유용하게 많이 쓰이는 군요.
최소 신장 트리에 대표적인 두가지 방법 prim
과 크루스칼
두 가지 방법을 썼을 때 시간 복잡도가 궁금합니다! 추후에 업데이트 가능할까요?
저는 비교하고 업데이트 해주는 과정이 시간 복잡도 상으로 따졌을 때 우선 순위 큐 하나로 처리하는 prim이 빠른 것 같아서 prim으로 단번에 처리하는 경우가 많다보니 문득 궁금해지네요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
유니온파인드를 전부터 잘 활용하시는 것 같아요! 크루스칼은 간선을 모두 확인하는 알고리즘인데 더 효율적인 알고리즘이 있는지 궁금합니당.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
마침 알고리즘 수업에서 스패닝 트리를 배우고 있는데 딱 좋은 타이밍에 스패닝 트리를 풀어주셨네요. 덕분에 스패닝 트리 공부 충분히 하고 갑니다.
pari<int, pair<int, int>> 는 좀 복잡하니까 구조체나 class 사용하던가 typedef를 통해 좀 더 간단히 줄여서 사용할 수 있습니다 :)
저는 |
위에 언급한 대로 |
감사합니다 ! 항상 저렇게 |
🔗 문제 링크
https://www.acmicpc.net/problem/1197
✔️ 소요된 시간
2시간
✨ 수도 코드
최소 스패닝(신장) 트리(mst)
란 주어진 그래프의 모든 정점을 연결하는 부분그래프중에서 그가중치의 합이 최소인 트리
를 의미합니다.이 조건을 만족하기 위해서는
1.간선의 개수가
(정점-1)
개 존재하여 한다.2.사이클이 존재하지 않아야한다.(트리의 특성)
이 두가지 조건에 신경을 써서 문제를 풀었습니다.
저는 이 최소 신장 트리를 구하기 위해
그리디 방식
을 이용하는kruskal 알고리즘
을 사용하였습니다. 이 알고리즘은 우선주어진 간선들 중
우선순위 큐
를 이용하여1.
최소 간선
부터 뽑아낸다. (greedy)2.그 간선을 추가했을때 사이클이 발생하는지
union-find
를 통해 확인해준다.3.if (사이클이 발생할경우) 반복문으로 돌아가서
큐에서 다시 간선을 뽑는다.
else(사이클 발생x) 그 간선을
카운트
(추가)해주고 간선의 가중치를sum
에 더해준다.4. 만약
(간선의개수==정점-1)
이 된다면 정점들이 다 연결된것이므로 종료한다.5. 가중치의 합이 저장된
sum
을 출력해준다.📚 새롭게 알게된 내용
실제로 자료구조 책에서 보기만 했던
최소 신장트리
인데 이렇게 직접union-find
를 이용해사이클
이 발생하는지 판별해주고greedy
를 이용하여(정점-1)개의간선
을 찾아나가는 과정이 흥미로웠다. 이번에는kruskal 알고리즘
을 이용하였지만 다음번에는prim 알고리즘
을 이용하여 풀어봐야겠다.