https://www.acmicpc.net/problem/1976
1976번: 여행 가자
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인지 알아보자. 물론 중간에 다른 도시를 경유해서 여행을 할 수도 있다. 예를 들어 도시가 5개 있고, A-B, B-C, A-D, B-D, E-A의 길이 있고, 동혁이의 여행 계획이 E C B C D 라면 E-A-B-C-B-C-B-D라는 여행경로를 통해 목적을 달성할
www.acmicpc.net
유니온파인드를 이용하는 문제.
import sys
input = sys.stdin.readline
N = int(input())
M = int(input())
adj = [[] for _ in range(N)]
class DisjointSet:
def __init__(self,n):
self.parent = list(range(n))
self.ch = [0]*n
self.size = n
def find_parent(self,x):
while x != self.parent[x]: x = self.parent[x]
return x
def union(self,x,y):
x = self.find_parent(x)
y = self.find_parent(y)
if x==y:
return
if self.ch[x] < self.ch[y]: #y가 애가 더 많으면
self.ch[y] += 1
self.parent[x] = y
else:
self.ch[x] += 1
self.parent[y] = x
disj = DisjointSet(N+1)
for i in range(N):
adj[i] = list(map(int,input().split()))
a,b,c = map(int,input().split())
for i in range(N):
for j in range(N):
if adj[i][j]:
disj.union(i+1,j+1)
# print(disj.parent)
# if (disj.find_parent(a) == disj.find_parent(b)) and (disj.find_parent(b) == disj.find_parent(c)):
# print("YES")
# else:
# print("NO")
if len(set([disj.parent[i] for i in [a,b,c]]))==1:
print("YES")
else:
print("NO")
왜 런타임 에러가 나는지 모르겠다.
'개발 > PYTHON 알고리즘 연습' 카테고리의 다른 글
2020 KAKAO BLIND RECRUITMENT : 자물쇠와 열쇠 (Python) (0) | 2020.05.08 |
---|---|
2020 KAKAO BLIND RECRUITMENT : 문자열 압축 (Python) (0) | 2020.05.08 |
[파이썬] 백준 9019번 : DSLR (0) | 2020.02.15 |
[파이썬] 백준 13913 : 숨바꼭질 4 (0) | 2020.02.13 |
[파이썬] 백준 9252 : LCS 2 (0) | 2020.02.13 |
댓글