https://www.acmicpc.net/problem/4195
4195๋ฒ: ์น๊ตฌ ๋คํธ์ํฌ
์ฒซ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ์น๊ตฌ ๊ด๊ณ์ ์ F๊ฐ ์ฃผ์ด์ง๋ฉฐ, ์ด ๊ฐ์ 100,000์ ๋์ง ์๋๋ค. ๋ค์ F๊ฐ์ ์ค์๋ ์น๊ตฌ ๊ด๊ณ๊ฐ ์๊ธด ์์๋๋ก ์ฃผ์ด์ง
www.acmicpc.net
์ ๋ ฅ๋ฐ๋ ์์๊ฐ ์ฌ๋์ด๋ฆ์ด๊ธฐ ๋๋ฌธ์ ์ซ์๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋์ ๋๋ฆฌ(people)๋ฅผ ์ ์ธํ๊ณ
1. a, b ์ ๋ ฅ๋ฐ์์
2. ๋์ ๋๋ฆฌ์ ์กด์ฌํ์ง ์์ผ๋ฉด ์ถ๊ฐ, parent ์ถ๊ฐ
3. union
๊ทธ ํ ์ฐ๊ฒฐ๋์ด ์๋ ์์๋ค์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด
์๋ count ํจ์๋ฅผ ์ผ๋๋ฐ ์ ๋๋ก ๋ชป ์ก์๋ด๊ธธ๋ for๋ฌธ์ ์ผ๋ค
ใ ใ ์๊ฐ์ด๊ณผ
import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline
def find_parent(parent, x):
if parent[x] != x:
parent[x] = find_parent(parent, parent[x])
return parent[x]
def union_parent(parent, a, b):
a = find_parent(parent, a)
b = find_parent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
t = int(input())
for i in range(t):
f = int(input())
people = dict()
parent = []
count = 0
for j in range(f):
a, b = input().split()
if a not in people:
people[a] = count
parent.append(count)
count += 1
if b not in people:
people[b] = count
parent.append(count)
count += 1
a = people[a]
b = people[b]
union_parent(parent, a, b)
check = find_parent(parent, a)
res = 0
for k in range(len(parent)):
if check == find_parent(parent, parent[k]):
res += 1
print(res)
์ฐ์ people ์ ๊ฑฐ -> parent๋ฅผ ๋์ ๋๋ฆฌ๋ก ๋ง๋ค์ด์ ๊ด๋ฆฌ
๊ธฐ์กด union ํจ์๋ ์ซ์๋ก ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํจ์ ์์
result ๋์ ๋๋ฆฌ ์ถ๊ฐ -> ๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅ
parent์ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋ ๋ result + 1
union ํจ์๋ฅผ ํตํด ๋คํธ์ํฌ๋ฅผ ํ์ฑํ ๋ ๋ ์ฌ๋์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ๋ชจ๋ ํฉ์น ๊ฐ์ ๋ถ๋ชจ result์ ์ ์ฅํ๋ค.
(๋ชจ๋ ์์์ result ๊ฐ์ ์ ๋ฐ์ดํธํ๊ธฐ ํ๋ฆ)
๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅํ ๋ ๋ถ๋ชจ๋ฅผ ์ฐพ์์ ๋ถ๋ชจ์ result ๊ฐ์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
๊ฒฐ๊ณผ๋,,, ๋ง์์ต๋๋ค!!
import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline
def find_parent(x):
if parent[x] != x:
parent[x] = find_parent(parent[x])
return parent[x]
def union_parent(a, b):
a = find_parent(a)
b = find_parent(b)
if a != b:
parent[b] = parent[a]
result[a] += result[b]
t = int(input())
for i in range(t):
f = int(input())
parent = dict()
result = dict()
for j in range(f):
a, b = input().split()
if a not in parent:
parent[a] = a
result[a] = 1
if b not in parent:
parent[b] = b
result[b] = 1
union_parent(a, b)
print(result[find_parent(a)])
'๐ค > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 1774: ์ฐ์ฃผ์ ๊ณผ์ ๊ต๊ฐ (Python) (0) | 2022.08.04 |
---|---|
๋ฐฑ์ค 1197: ์ต์ ์คํจ๋ ํธ๋ฆฌ (Python) (0) | 2022.07.29 |
๋ฐฑ์ค 1976: ์ฌํ ๊ฐ์ (Python) (0) | 2022.07.28 |
๋ฐฑ์ค 1717: ์งํฉ์ ํํ (Python) (0) | 2022.07.28 |
๋ฐฑ์ค 11657: ํ์๋จธ์ (Python) (0) | 2022.07.18 |