From c78f4f834045ba82b1fbbde0fd062816e933b752 Mon Sep 17 00:00:00 2001 From: H0zzae <39540561+H0zzae@users.noreply.github.com> Date: Thu, 4 Feb 2021 14:22:18 +0900 Subject: [PATCH] =?UTF-8?q?=ED=81=AC=EB=A3=A8=EC=8A=A4=EC=B9=BC=20?= =?UTF-8?q?=EC=95=8C=EA=B3=A0=EB=A6=AC=EC=A6=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 예제 ) 7 9 1 2 29 1 5 75 2 3 35 2 6 34 3 4 7 4 6 23 4 7 13 5 6 53 6 7 25 --- Kruskal/Kruskal.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Kruskal/Kruskal.py diff --git a/Kruskal/Kruskal.py b/Kruskal/Kruskal.py new file mode 100644 index 0000000..c53482c --- /dev/null +++ b/Kruskal/Kruskal.py @@ -0,0 +1,36 @@ +import sys +M,N = map(int, sys.stdin.readline().split()) # M = 지점갯수, N = 주어질 루트 갯수 +kruskal_input = [] +for _ in range(N): + S,D,L = map(int, sys.stdin.readline().split()) + kruskal_input.append([S-1,D-1,L]) +kruskal_input.sort(key=lambda x:x[2],reverse=True) #cost가 큰 순으로 정렬-> pop으로꺼내기 +checked = [[] for _ in range(M)] +def checkCycle(root): # cycle이 만들어지는지 검사 True=> 사이클x, False=>사이클o Root[0] 첫번째에서 다른곳으로 경유 후 Root[1]로 오면 사이클 + if checked[root[0]] ==[] and checked[root[1]]==[]: + return True + for n in checked[root[0]]: + if n[0] == root[1]: + return False + for i in checked[n[0]]: + for j in checked[i[0]]: + if i[0] == root[1] or j[0]==root[1]: + return False + return True + + +root = kruskal_input.pop() +checked[root[0]].append([root[1],root[2]]) +checked[root[1]].append([root[0],root[2]]) +cnt = root[2] +for _ in range(N-1): + root = kruskal_input.pop() + # root추가했을때 사이클 도는지 안도는지 확인 후 + if (checkCycle(root)) : # 사이클이 돌면 추가 X + # 사이클이 돌지 않으면 checked에 추가 + checked[root[0]].append([root[1],root[2]]) + checked[root[1]].append([root[0],root[2]]) + cnt+=root[2] + +print(checked) +print(cnt) \ No newline at end of file