13265๋ฒ - ์์น ํ๊ธฐ
ํธ๋ฆฌ๊ฐ ํ๋ ์ฃผ์ด์ก์ ๋ ์ด ํธ๋ฆฌ๋ฅผ ๋ ๊ฐ์ง ์์ผ๋ก ์์น ํ ์ ์๋์ง ๋ฌป๋ ๋ฌธ์ ์
๋๋ค.
๋ค๋ง, ์ด์ด์ง ๋
ธ๋๋ผ๋ฆฌ๋ ๊ฐ์ ์์ ๋จ ์ ์์ต๋๋ค.
์ผ๋จ ๋จ์ํ ๊ตฌํ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๊ณ
๋
ธ๋๋ฅผ ๋ชจ๋ ์ด์ง ํธ๋ฆฌ๋ก์จ ์ทจ๊ธํ์ฌ ์๊ฐํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
๋ ๋ฒจ 1์์๋ ๋นจ๊ฐ์, ๋ ๋ฒจ 2์์๋ ํฐ์, ๋ ๋ฒจ 3์์๋ ๋ค์ ๋นจ๊ฐ์ ... ์ด๋ฐ์ฉ์ผ๋ก ํ์ฌ
๋ง์ฝ ํ์ฌ ํ์์ค์ธ ๋
ธ๋์ ํ์ํ ๋
ธ๋๊ฐ ์๋ก ์ด์ด์ ธ์๋๋ฐ ๊ฐ์ ์์ ๋๋ค, ์ด๋ฌ๋ฉด ๋ ๊ฐ์ง ์์ผ๋ก ์น ํ์ง ๋ชปํ๊ณ ๋ง์ฝ ์๋๋ผ๋ฉด ๋ ๊ฐ์ง ์์ผ๋ก ์น ํ ์ ์์ต๋๋ค.
์๋ง ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค๋ณด๋ฉด ์ด๋ฐ ๋๋์ด์ง ์์๊น ์ถ์ต๋๋ค...
t = int(input())
que = deque()
for _ in range(t):
ans = []
que.clear()
a,b = map(int,input().split())
์ผ๋จ ํธ๋ฆฌ๋ฅผ t๋งํผ ๋ฐ๊ณ BFS ์ฌ์ฉ์ ์ํด que๋ฅผ ๋ฐ์์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ a,b๋ก ํธ๋ฆฌ๋ฅผ ๋ฐ์์ฃผ๊ธฐ ์์ํ๊ฒ ์ต๋๋ค. que๋ฅผ ๋น์ฐ๋ ์ด์ ๋ ์ด๋ฐ ์์ธํ ์์ ํ๊ฒ ์ต๋๋ค.
graph = [[0]*(a+1) for _ in range(a+1)]
visited = [0]*(a+1)
๊ทธ๋ํ์ ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ์ ์ธํ๊ณ
for _ in range(b):
c,d = map(int,input().split())
graph[c][d] = graph[d][c] = 1
์ด์ฐจ์๋ฐฐ์ด๋ก c๋ ธ๋์ d๋ ธ๋๊ฐ ์ด์ด์ก๋ค๋ ํ์์ผ๋ก ํํํด์ค์๋ค.
for i in range(1,d+1):
if not visited[i]:
ans.append(bfs(i))
๊ทธ๋ฆฌ๊ณ ๋ ธ๋์ค์ ๋ฐฉ๋ฌธ ์ํ ๋ ธ๋๊ฐ ์กด์ฌํ๋ค๋ฉด ํด๋น ๋ ธ๋๋ bfs ํ์์ ๋๋ ค์ค๋๋ค.
from collections import deque
import sys
input = sys.stdin.readline
def bfs(N):
color = True
visited[N] = 1
graph[0][N] = color
color = False
que.append(N)
์ด ๋ฌธ์ ๊ฐ ํ๋ค๋ณด๋ ์๊ฐ์ ํ์ ์ข ๋ฏผ๊ฐํ ์น๊ตฌ์ฌ์ sysinput ์ ์ธํด์ฃผ๊ณ ์์ํ๊ฒ ์ต๋๋ค.
์ด์งํผ ์์ ๋๊ฐ์ง๋ฏ๋ก True ์ False๋ก ๊ตฌ๋ถํด์ฃผ๊ณ ์ด๊ธฐ ์๊น์ True๋ก ์ง์ ํด์ค ๋ค์์ ์ด๊ธฐ ์๊น์ graph[0]์ ๋ฃ์ด์ฃผ๊ฒ ์ต๋๋ค (์ด์งํผ ์์ฐ๋ ์๋ฆฌ, ํ์์ ์ธ๋ฑ์ค ์ซ์ ๋ง์ถ๋ ค๊ณ +1 ์ ์ธํด์ ๋น๋ ๊ณต๊ฐ). ๊ทธ๋ฆฌ๊ณ ๋
ธ๋ ๋ ๋ฒจ 0์ ํ์์ด ๋๋๊ฑฐ๋๊น color๋ False๋ก ๋ฐ๊ฟ์ฃผ๊ณ (๋ค์ ํธ๋ฆฌ ๋ ๋ฒจ ๋์ด ๊ฐ ๋ ์ ๋ณ๊ฒฝ) ๋ฐฉ๋ฌธ์ฌ๋ถ 1๋ก ๋ฐ๊ฟ์ฃผ๊ณ que์ ์ถ๊ฐํ๋ฉด์ ํ์์ ์์ํฉ๋๋ค.
while que:
for _ in range(len(que)):
connect = que.popleft()
for i in range(len(graph[0])):
์ด๋ฒ์๋ ์ด์ ๋ฌธ์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก BFS์ level์ ํ์ ํด์ผ ํ๋ฏ๋ก len(que)๋งํผ๋ง for๋ฌธ์ ๋๋ ค์ฃผ๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํญ์ ํ์ํ๋ฏ์ด
if not visited[i] and graph[connect][i] != 0:
visited[i] = 1
que.append(i)
๋ง์ฝ ๋ ธ๋๋ผ๋ฆฌ ์ด์ด์ ธ์๊ณ ์์ง ๋ฐฉ๋ฌธ์ ์ํ์ผ๋ฉด ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ํ๊ณ ๋ค์ ํ์๊ตฌ๊ฐ์ผ๋ก ์ง์ ํด์ค๋๋ค.
graph[0][i] = color
์ด๋ฐ์ ๋ ๋ฒจ 0์์ ์ปฌ๋ฌ๋ฅผ ๋ฐ๊พธ๊ณ for๋ฌธ์ ๋ค์ด์์ผ๋ฏ๋ก color ๋ณ์ ๊ทธ๋๋ก graph[0][i], ์ฆ ๋ค์ ํ์์ง์ ์ ์๊น์ ๋์ ํด์ฃผ๋๋ก ํฉ๋๋ค.
if graph[connect][i] != 0:
if graph[0][i] == graph[0][connect]:
return 'impossible'
๋ง์ฝ ํ์์ ํ ๋
ธ๋์ ํ์ฌ ํ์ ์ค์ธ ๋
ธ๋์ ์๊น์ด ์ผ์นํ๋ค๋ฉด impossible์ return ํด์ฃผ๋๋ก ํฉ์๋ค.
0์ด ์๋ ๋๋ผ๋ ์กฐ๊ฑด์ ๊ฑด ์ด์ ๋ ๋ง์ฝ graph[0]์ ์ธ๋ฑ์ค์ ์ด๊ธฐ๊ฐ์ด 0์ธ๋ฐ ์๊น์ด ์์ ์๋ค์ด์๋ ์ธ๋ฑ์ค์ ๋ง๋ฌผ๋ฆฌ๊ฒ ๋๋ฉด ์กฐ๊ฑด์์ด ๋ฐ๋๋๋ ๋์ฐธ์ฌ๊ฐ ์ผ์ด๋๋ฏ๋ก ์ง์ ํด์ค์ผ ํฉ๋๋ค.
if color == False:
color = True
elif color == True:
color = False
๋ง์ง๋ง์ผ๋ก ํด๋น ๋ ๋ฒจ์ ์๊น์ ๋ค ์ง์ ํ์ผ๋ฉด ๋ค์ ๋ ๋ฒจ๋ก ๋์ด๊ฐ ๋ ์๊น์ ๋ณ๊ฒฝํด์ค์๋ค.
if 'impossible' in ans:
print('impossible')
else:
print('possible')
์ต์ข ์ ์ผ๋ก ans๋ฐฐ์ด์ impossible์ด ์๋ค๋ฉด ๋ถ๊ฐ๋ฅ, ์๋ค๋ฉด ๊ฐ๋ฅ์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ฉ๋๋ค.
์๊น
for _ in range(t):
ans = []
que.clear()
a,b = map(int,input().split())
์์ que.clear()๋ฅผ ํด์ค ์ด์ ๊ฐ ์ด๊ฒ BFS๊ฐ ์คํ๋๋ค๊ฐ return์ ๋ง๋๋ฉด ๊ตณ์ด while์ ์๋ que๊ฐ์ ๋ค ๋นผ๊ณ ๋์ฌ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ que์ ๊ฐ์ด ์๋ฅํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ ์ด ์ํ๋ก que๋ฅผ ์ด๊ธฐํ์ํค์ง ์๊ณ ๋ค์ BFS๋ฅผ ๋๋ฆฌ๋ฉด ๊ฐ์ด ์ค์ผ๋์ ์ด์ํ ๊ฒฐ๊ณผ๊ฐ ๋์๋ฒ๋ฆฝ๋๋ค. ์ด๊ฒ๋๋ฌธ์ ์๋นํ ์๊ฐ์ ํ๋นํด์ ์์ผ๋ก ์ฝ๋๋ฅผ ์งค ๋๋ ์ด๋ฐ ๋ณ์๋ค ์ ์ฌํ ์ดํด์ผ๊ฒ ์ต๋๋ค.