안녕하세요. 모카의 머신러닝 입니다. 이번 포스팅에서는 백준 알고리즘 문제 풀이에 대해 포스팅하도록 하겠습니다.
코드는 이곳을 참고했음을 밝힙니다.
1. Graph (Union Find)
백준 1717번
https://www.acmicpc.net/problem/1717
import sys
input = sys.stdin.readline
sys.setrecursionlimit(100000)
N, M = map(int, input().split())
parent = [0] * (N+1)
def find(a):
if a == parent[a]:
return a
else:
parent[a] = find(parent[a])
return parent[a]
def union(a, b):
a = find(a)
b = find(b)
if a!=b:
parent[b] = a
def checkSame(a, b):
a = find(a)
b = find(b)
if a == b:
return True
return False
for i in range(0, N+1):
parent[i] = i
for i in range(M):
question, a, b = map(int, input().split())
if question == 0:
union(a, b)
else:
if checkSame(a, b):
print("YES")
else:
print("NO")
백준 1976번
https://www.acmicpc.net/problem/1976
N = int(input())
M = int(input())
dosi = [[0 for j in range(N+1)] for i in range(N+1)]
def find(a):
if a == parent[a]:
return a
else:
parent[a] = find(parent[a])
return parent[a]
def union(a, b):
a = find(a)
b = find(b)
if a != b:
parent[b] = a
for i in range(1, N+1):
dosi[i] = list(map(int, input().split()))
dosi[i].insert(0, 0)
route = list(map(int, input().split()))
route.insert(0, 0)
parent = [0]*(N+1)
for i in range(1, N+1):
parent[i] = i
for i in range(1, N+1):
for j in range(1, N+1):
if dosi[i][j] == 1:
union(i,j)
index = find(route[1])
isConnect = True
for i in range(2, len(route)):
if index != find(route[i]):
isConnect = False
break
if isConnect:
print("YES")
else:
print("NO")
백준 1043번
https://www.acmicpc.net/problem/1043
N, M = map(int, input().split())
trueP = list(map(int, input().split()))
T = trueP[0]
del trueP[0]
result = 0
party = [[] for _ in range(M)]
def find(a):
if a == parent[a]:
return a
else:
parent[a] = find(parent[a])
return parent[a]
def union(a, b):
a = find(a)
b = find(b)
if a != b:
parent[b] = a
def checkSame(a, b):
a = find(a)
b = find(b)
if a == b:
return True
return False
for i in range(M):
party[i] = list(map(int, input().split()))
del party[i][0]
parent = [0] * (N + 1)
for i in range(N + 1):
parent[i] = i
for i in range(M):
firstPeople = party[i][0]
for j in range(1, len(party[i])):
union(firstPeople, party[i][j])
for i in range(M):
isPossible = True
cur = party[i][0]
for j in range(len(trueP)):
if find(cur) == find(trueP[j]):
isPossible = False
break
if isPossible:
result += 1
print(result)
지금까지 백준 알고리즘 그래프 2 유니온 파인드 부분이었습니다.
읽어주셔서 감사합니다. 😃