๐ ๋ฌธ์
์๋๋ก๋ฉ๋ค ์ ์น์ ์ต์คํ๋ ์ค๋ฐ์์๋ ๋ค์ ์ฃผ์ ์จ๋๊ณต์์ผ๋ก ์ํ์ ๊ฐ๋๋ค. ์์ ์ ์๋์ ์ํ ๋ ํ์๋ค์ ๋ ๋ช ์ฉ ์ง์ ์ง์ด ํ๋ํ๊ฒ ํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์๋ก ์น๊ตฌ๊ฐ ์๋ ํ์๋ค๋ผ๋ฆฌ ์ง์ ์ง์ด ์ฃผ๋ฉด ์๋ก ์ธ์ฐ๊ฑฐ๋ ๊ฐ์ด ๋์๋ค๋์ง ์๊ธฐ ๋๋ฌธ์, ํญ์ ์๋ก ์น๊ตฌ์ธ ํ์๋ค๋ผ๋ฆฌ๋ง ์ง์ ์ง์ด ์ค์ผ ํฉ๋๋ค.
๊ฐ ํ์๋ค์ ์์ ๋ํด ์ด๋ค์ด ์๋ก ์น๊ตฌ์ธ์ง ์ฌ๋ถ๊ฐ ์ฃผ์ด์ง ๋, ํ์๋ค์ ์ง์ง์ด์ค ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์. ์ง์ด ๋๋ ํ์๋ค์ด ์ผ๋ถ๋ง ๋ค๋ฅด๋๋ผ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ด ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๋ก ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋๋ค.
- (ํ์ฐ,์ ์์นด) (์จ๋,ํฐํ๋) (ํจ์ฐ,์ ๋ฆฌ)
- (ํ์ฐ,์ ์์นด) (์จ๋,์ ๋ฆฌ) (ํจ์ฐ,ํฐํ๋)
โ ์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ์ C (C <= 50) ๊ฐ ์ฃผ์ด์ง๋๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ ์ค์๋ ํ์์ ์ n (2 <= n <= 10) ๊ณผ ์น๊ตฌ ์์ ์ m (0 <= m <= n*(n-1)/2) ์ด ์ฃผ์ด์ง๋๋ค. ๊ทธ ๋ค์ ์ค์ m ๊ฐ์ ์ ์ ์์ผ๋ก ์๋ก ์น๊ตฌ์ธ ๋ ํ์์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋๋ค. ๋ฒํธ๋ ๋ชจ๋ 0 ๋ถํฐ n-1 ์ฌ์ด์ ์ ์์ด๊ณ , ๊ฐ์ ์์ ์ ๋ ฅ์ ๋ ๋ฒ ์ฃผ์ด์ง์ง ์์ต๋๋ค. ํ์๋ค์ ์๋ ์ง์์ ๋๋ค.
๐ป ์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ํ ์ค์ ๋ชจ๋ ํ์์ ์น๊ตฌ๋ผ๋ฆฌ๋ง ์ง์ง์ด์ค ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๊ฐ๋ฅํ n์ ์ต๋๊ฐ์ด 10์ผ๋ก ํฌ์ง ์๊ณ , ๊ฐ๋ฅํ ๋ชจ๋ ์กฐํฉ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ฏ๋ก ์์ ํ์์ผ๋ก ์ ๊ทผํ ์ ์๋ค.
์์์ ์์๋ง ๋ค๋ฅธ ์์์์ด๋ ์กฐํฉ์ ์ค๋ณตํด์ ์นด์ดํธํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค. (์ฐ์ ์์ ํ์)
์ฐ์ ๊ต์ฌ์์ ์๊ฐํ ๋๋ก first_free ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ด ์ง์ด์ง์ง ์์ ํ์ ์ค์์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ํ์์ ๋ํ์ฌ ๋จผ์ ์ง์ ์ฐพ๋๋ก ํ๋ค.
first_free๊ฐ -1์ธ ๊ฒฝ์ฐ, ์ง์ด ์ง์ด์ง์ง ์์ ํ์์ด ์๋ ๊ฒ์ด๋ฏ๋ก 1์ ๋ฐํํ๋ค.
import sys
input = sys.stdin.readline
def countingPairs(taken, are_friends):
ans = 0
first_free = taken.index(False) if False in taken else -1
if first_free == -1: return 1
for pair_with in range(first_free + 1, students_count):
if (not taken[first_free] and not taken[pair_with] and are_friends[first_free][pair_with]):
taken[first_free] = taken[pair_with] = True
ans += countingPairs(taken, are_friends)
# ๋ฐฑํธ๋ํน
taken[first_free] = taken[pair_with] = False
return ans
C = int(input())
for _ in range(C):
students_count, friends_count = map(int, input().split())
taken = [False] * students_count
friends_list = list(map(int, input().split()))
are_friends = [[False] * students_count for _ in range(students_count)]
for i in range(0, friends_count * 2, 2):
are_friends[friends_list[i]][friends_list[i + 1]] = True
are_friends[friends_list[i + 1]][friends_list[i]] = True
print(countingPairs(taken, are_friends))
2์ฐจ์ ๋ฐฐ์ด are_freinds๋ฅผ ์ฌ์ฉํ์ง ์๊ณ friends_list ๋ฐฐ์ด์ ๊ทธ๋๋ก ์ฌ์ฉํ์์ผ๋ฉฐ, countingPairs ํจ์์ ๋งค๊ฐ๋ณ์๋ก start๋ฅผ ์ฌ์ฉํ๋ค.
start ๊ฐ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ฐฑํธ๋ํน์ ์ํํ๋ฏ๋ก ์ค๋ณต๋ ์์์์ด ์นด์ดํธ๋์ง ์๋๋ค.
๋ฐ๋ผ์ first_free ๋ณ์๊ฐ ์ญ์ ๋์๊ณ , taken์ด ๋ชจ๋ ์ฐธ์ผ ๋ 1์ ๋ฐํํ๋๋ก ํ๋ค.
import sys
input = sys.stdin.readline
def countingPairs(taken, start):
ans = 0
if all(t for t in taken): return 1
for i in range(start, friends_count):
idx1, idx2 = friends_list[i * 2], friends_list[i * 2 + 1]
if not taken[idx1] and not taken[idx2]:
taken[idx1] = taken[idx2] = True
ans += countingPairs(taken, i + 1)
taken[idx1] = taken[idx2] = False
return ans
C = int(input())
for _ in range(C):
students_count, friends_count = map(int, input().split())
taken = [False] * students_count
friends_list = list(map(int, input().split()))
print(countingPairs(taken, 0))