tjgocks   4년 전

반례에 있는 케이스까지 모두 해보았는데 정답이 되지 않습니다. 고수님들 도와주세요 ㅠㅠ

+) 해결했습니다 감사합니다.

danimartinwife   4년 전

https://www.acmicpc.net/board/view/41802 여기 반례 읽어보셨나요? 저의 의견인데 이분이 제시하신 반례들은 대체로 "모든 섬이 연결되지 않은 경우" 입니다.

우선 저는 크루스칼로 풀지 않았고 브루트포스 일명 삽질로 해결하긴 했습니다만, 어떤 방법으로 풀든 문제에서 "모든 섬이 연결되어야 한다" 라는 조건을 제시하였기 때문에 먼저 정점들이 모두 연결되었는지 확인을 하셔야 합니다. 저는 유니온 파인드를 많이 연습하지 않아서 잘 모르겠지만, 질문자님께서 모든 정점의 연결 여부를 체크하시는 부분은 어디서 구현하셨는지 여쭤봐도 괜찮을까요?

제 생각이지만, 이번 역량테스트 9월 기출문제 두문제 모두 그래프의 연결요소라는 개념이 핵심이었고 두문제 모두 해당 이론을 모르면(저 같은 경우는 구현할 수 없으면 배경지식은 알아도 모르는 것으로 간주합니다) 풀기 어려운 문제였습니다.

tjgocks   4년 전

섬을 라벨링을 하였습니다. 코드에서 섬의 개수가 n이라면 num은 n+1이 됩니다. vertex의 개수가 n인 MST의 edge는 항상 n-1입니다. 그래서 110번 줄 비교가 모든 정점이 연결된것을 확인하는 코드입니다. num은 vertex+1이고 edgeNum은 edge개수 즉,vertex-1 이므로 num-2와 edgeNum의 개수를 비교한 것입니다.

tjgocks   4년 전

제 코드에서 find(v1)은 v1의 루트 vertex를 반환합니다. 따라서 98번째 라인에서 이미 두 정점이 연결이 되었는지 아닌지(사이클을 형성하는지 아닌지) 판단할 수 있다고 생각합니다.

(v1과 v2가 연결이 되었다는 것은 v1(v2)에서 v2(v1)로 가는 단순 경로가 항상 존재한다는 것을 의미합니다.)

tjgocks   4년 전

탐색하는부분에서 문제가있어서 수정했습니다 감사합니다~

danimartinwife   4년 전

저도 union-find 개념만 알고 활용법은 몰랐는데 덕분에 알게됐습니다. 감사합니다!

댓글을 작성하려면 로그인해야 합니다.