import sys
from collections import deque
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
# DFS๋ก ๋
ธ๋๋ฅผ ํ์ํ๋ฉด์ ๊ฐ์ ๊ทธ๋ฃน์ ๋
ธ๋๋ฅผ ๋ง๋๋ฉด ํ์์ ๋๋ด๊ณ False๋ฅผ ๋ฆฌํดํ๋ค.
def dfs(start, flag, graph, group):
# ํด๋น ๋
ธ๋๋ฅผ ๊ทธ๋ฃนํํ๋ค.
flag[start] = group
# ๋
ธ๋์ ์ฐ๊ฒฐ์ด์์ผ๋ฉด์ ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ค์ ์ํํ๋ฉฐ ๊น์ด ํ์์ ์ํํ๋ค.
for e in graph[start]:
if flag[e] == 0:
res = dfs(e, flag, graph, -group)
if not res:
return False
# ๊ฐ์ ๊ทธ๋ฃน์ ๋
ธ๋๊ฐ ์ด์ํ๊ฒ ๋๋ ๊ฒฝ์ฐ ์ด๋ถ ๊ทธ๋ํ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
elif flag[e] == group:
return False
return True
K = int(input())
for n in range(K):
v, edges = map(int, input().split())
graph = [[ ] for i in range(v+1)]
visited = [0]*(v+1)
e_list = []
# ์ธ์ ๋ฆฌ์คํธ ์์ฑ
for _ in range(edges):
x, y = map(int, input().split())
graph[x].append(y)
graph[y].append(x)
e_list.append([x, y])
# ๋
ธ๋๋ค์ด ๋์ด์ ธ ์๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋
ธ๋๋ฅผ ๋ฐ๋ณตํ๋ค.
for index in range(1, v + 1):
# ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ
if visited[index] == 0:
# ๊น์ด ํ์์ ํตํด ์ด์ด์ง ๋
ธ๋๋ฅผ ์ํํ๋ฉฐ ๋
ธ๋๋ฅผ ๊ทธ๋ฃนํํ๋ค.
res = dfs(index, visited, graph, 1)
# ํด๋น ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์์ ์ด๋ถ ๊ทธ๋ํ๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉด ๋ฐ๋ณต์ ์ค๋จํ๋ค.
if not res:
break
print('YES') if res else print('NO')
๐ฉย ๋ชป ํผ ์์ธ ๐ฉ
๋ฌธ์ ์ดํด๋ฅผ ์ ๋๋ก ๋ชปํ ๊ฒ ๊ฐ๋ค. ๋ฌธ์ ๊ทธ๋๋ก ์ดํดํ์ผ๋ฉด ์ ์ ์ ๊ทธ๋ฃนํํ๋ ๋ฐฉ์์ ๊ณ ๋ฏผํ์ํ ๋ฐ ๊ฐ์ ์ ์ ๊ฑฐํ์ ๋ ์์ ํ ๋ ๊ทธ๋ฃน์ผ๋ก ๋ถ๋ฆฌ๋์ด์ผํ๋ค๋ ๋์์ค๋ก ์๋ชป ์ดํดํด์ ๋๋ฌด ์ด๋ ต๊ฒ ์๊ฐํ ๊ฒ ๊ฐ๋ค.
import sys
import heapq
input = sys.stdin.readline
N = int(input())
maze = [ list(map(int, input()[:-1])) for _ in range(N) ]
visited = [ [ False ] * N for _ in range(N) ]
# ์ด๊ธฐ๊ฐ ์ค์
queue = [[0, 0, 0]]
dx = [1, 0, -1, 0]
dy = [0, -1, 0, 1]
while queue:
cost, x, y = heapq.heappop(queue)
# ๋ฏธ๋ก ๋์ ๋์ฐฉํ ๊ฒฝ์ฐ ๋ฐ๋ณต์ ๋๋ด๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
if x == N - 1 and y == N - 1:
print(cost)
break
# ํด๋น ์นธ์ ๋ํด์ ์, ํ, ์ข, ์ฐ ์นธ์ผ๋ก ์ด๋ํ๋ค.
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
# ๋ฏธ๋ก๋ฅผ ๋ฒ์ด๋์ง ์๊ณ , ๋ฐฉ๋ฌธํ์ง ์์ ์นธ๋ง ํธ๋ค๋งํ๋ค.
if 0 <= nx < N and 0 <= ny < N and visited[ny][nx] == False:
visited[ny][nx] = True
# ๋ค์ ์นธ์ด ๊ฒ์๋ฐฉ์ธ ๊ฒฝ์ฐ cost ๊ฐ ๊ฐฑ์
if maze[ny][nx] == 1:
heapq.heappush(queue, [cost, nx, ny])
else:
heapq.heappush(queue, [cost + 1, nx, ny])
# ** ์ ๊ทผ ๋ฐฉ์ **
# ์ฐ์ ์์ ํ๋ฅผ ํ์ฉํ BFS๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ํ๋ฉด๋๋ค.
# ํนํ ์ฐ์ ์์ ํ์ ๋์์ ์ง์คํด์ ์ด๋ค ๋ฐฉ์ ๋จผ์ ๋ฐฉ๋ฌธํ๋์ง ์๊ฐํด๋ณผ ํ์๊ฐ ์๋ค.
# ํ์๋ฐฉ์ด๋, ๊ฒ์ ๋ฐฉ์ด๋ ๋ฐฉ์ ๋ง๋ฌ์ ๋ ์ฐ์ ์์ ํ์ ์ถ๊ฐ๋๋ ๋ถ๋ถ์ ๊ฐ์ง๋ง,
# ๊ฒ์ ๋ฐฉ์ ๊ฒฝ์ฐ cost๊ฐ ๋์ด๋๊ธฐ ๋๋ฌธ์ ์ฐ์ ์์ ํ ๋ด๋ถ์์ ์์๊ฐ ๋ค๋ก ๋ฐ๋ฆฌ๊ฒ ๋๋ค.
# ๊ทธ๋์ ๊ฐ์ cost์ ํ์ ๋ฐฉ์ BFS๋ก ํ์ํ๊ณ , ๋ฏธ๋ก ๋์ ๋๋ฌํ์ง ๋ชปํ ๊ฒฝ์ฐ,
# ๋ค์ ๋ฐฉ์ ์ด์ด ํ์์ ๋ฐ๋ณตํ๊ฒ ๋๋ค.
๐ฉย ๋ชป ํผ ์์ธ ๐ฉ
BFS๋ก ์ธ์ ํ ๋ฐฉ์ ๋ฐฉ๋ฌธํ๋ฉด์ ์ด์ ๋ฐฉ์ ํ์์ ํ์ฌ ๋ฐฉ์๊น์ ํตํด์ ํ์ฌ ๋ฐฉ์ ๋๋ฌํ๊ธฐ๊น์ง ๋ ์ ๊ฒ ๋ฌธ์ ์ฐ ํ์๋ก ๊ฐฑ์ ํ๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ํด๊ฒฐ์ ํ๊ณ ์์๋ค. ๋ฐฉ์ ์ฌ๋ฌ ๊ฒฝ๋ก๋ฅผ ํตํด ์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ํน์ ๋ฐฉ์ ์ด๋ฏธ ์ง๋ ์ดํ ๋ ์ ์ ํ์๋ก ๋ค์ ๋์ฐฉํ์ ๋ ์ดํ ๋ฐฉ์ ๋ํด์ ๋ ๋ค์ BFS๋ฅผ ๊ฑธ์ด์ฃผ๋ ๋ฐฉ์์ ์ฐพ์ง๋ชปํ๋ค.
60์ ์ง๋ฆฌ ๋ด ์ ๊ทผ๋ฒ
ํ ์คํธ ๊ทธ๋๋ก โ์ค๋ด์์ ์ค๋ด๋ก ๋์ฐฉโํ๋ ์ผ์ด์ค๋ฅผ DFS๋ก ๋ชจ๋ ์ค๋ด ๋ ธ๋๋ฅผ ํ์ํ๋ฉฐ countํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ํ์ ๋ ๊ฒฐ๊ณผ๋ ๋ถ๋ถ ์ ๋ต๋ฐ์ ๋ฐ์ ์ ์์๊ณ , ๋ค๋ฅธ ๋ถ๋ค์ ํ์ด๋ฅผ ์ฐธ๊ณ ํ๋ค.
import sys
input = sys.stdin.readline
N = int(input())
A = [0] + [ int(i) for i in input()[:-1] ]
graph = [ [] for _ in range(N + 1) ]
for _ in range(N - 1):
f, t = map(int, input().split())
graph[f].append(t)
graph[t].append(f)
count = 0
def dfs(count, start, isOut):
visited[start] = True
# ์ด์ ๋ง ๋์จ ์ผ์ด์ค
if isOut == False and A[start] == 1:
isOut = True
# ์ค์ธ์ ์๋ค๊ฐ ์ค๋ด๋ก ๋ค์ด์จ๊ฑด์ง
elif isOut == True and A[start] == 1:
count += 1
return count
for e in graph[start]:
if visited[e] == False:
count = dfs(count, e, isOut)
return count
for n in range(1, N + 1):
visited = [ False ] * ( N + 1 )
if A[n] == 1:
res = dfs(0, n, False)
count += res
print(count)
๋ฌธ์ ๋ฅผ ๋ณด๊ณ ๊ฐ๋ตํ๊ฒ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ ๊ฒ ๊ฐ๋ค.
๊ฒฐ๊ตญ (์ค๋ด) - (์ค๋ด) ์ฌ์ด์ ์ค์ธ๊ฐ ์ผ๋ง๋ ์๋ ๋ ๊ฐ์ ์ค๋ด๊ตฌ์ญ๋ง ๊ณ ๋ฅด๋ฉด ๋๋ ๋ฌธ์ ์๋ค.
๋ฌธ์ ์ ์์๋ฅผ ๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฝ์๋ผ ์ ์๋ค.
CASE 1 - ์ค์ธ๋ฅผ ๊ฑฐ์น๋ ๊ฒฝ์ฐ
(์ค๋ด) - (์ค์ธ) * x - (์ค๋ด)์ ๊ฒฝ์ฐ, ์ค์ธ๋ฅผ ๋๋ฌ์ธ๋ ๋ ธ๋ ์ค 2๊ฐ๋ฅผ ๋ฝ๋ ๋ฐฉ์๊ณผ ๋์ผํ๋ค.
๋ฐ๋ผ์ ์ ์ฒด ๊ฒฝ์ฐ์ ์๋ N(N-1)์ด ๋์ค๊ฒ ๋๋ค. ๋ฌธ์ ์ ์์์์๋ 1, 3, 4 ๋ ธ๋ ์ค 2๊ฐ๋ฅผ ๋ฝ๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก 3 * 2๋ก 6๊ฐ์ ์ผ์ด์ค๊ฐ ๋์จ๋ค.
์ ๊ทธ๋ฆผ์ฒ๋ผ ์ค์ธ ์ฌ์ด์ ์ค๋ด๊ฐ ๋ผ์ด์๋ ํํ์ ๊ฒฝ์ฐ์๋ ๋์ผํ๋ค.
ํ์ง๋ง ์ฝ๊ฐ์ ์ค๊ณ๊ฐ ํ์ํ๋ค.
์ค์ธ ๋ ธ๋์์ ํ์์ ์์ํ๊ณ ์ค๋ด๋ฅผ ๋ง๋๋ฉด ํ์์ ์ข ๋ฃํ๊ฒ ๋๋ค. ํ์ง๋ง ๊ทธ๋ ๊ฒ ๋๋ฉด ๋ฐ๋ํธ ์ค์ธ์ ๋ํ ํ์์ด ๋๊ธฐ๋ ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต๋ฌธ์ ํตํด์ ๋ชจ๋ ๋ ธ๋๋ฅผ ์ต์ํ ํ๋ฒ์ ํ์ํ๋๋ก ํด์ฃผ์ด์ผํ๋ค.
CASE 2 - ์ค์ธ๋ฅผ ๊ฑฐ์น์ง ์๋ ๊ฒฝ์ฐ
์ค์ธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฒซ๋ฒ์งธ ์ผ์ด์ค์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ์๋ฅผ ์ถ๊ฐํด์ฃผ์ด์ผํ๋ค.
์ธ์ ํ ์ค๋ด๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ๊ฒฝ์ฐ์ (์ค๋ด1) โ (์ค๋ด2), (์ค๋ด2) โ (์ค๋ด1) ์ด ๋๋ฒ์ ์ด ํ์์ ์ถ๊ฐํด์ค๋ค.
โ๏ธย ์์ ์ฝ๋ โ๏ธ
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
def dfs(v):
visited[v] = True
in_count = 0
for e in graph[v]:
if A[e] == 1:
in_count += 1
elif not visited[e] and A[e] == 0:
in_count += dfs(e)
return in_count
N = int(input())
A = [0] + [ int(i) for i in input()[:-1] ]
graph = [ [] for _ in range(N + 1) ]
visited = [ False ] * ( N + 1 )
total = 0
for _ in range(N - 1):
f, t = map(int, input().split())
graph[f].append(t)
graph[t].append(f)
if A[f] == 1 and A[t] == 1: # CASE 2
total += 2
for n in range(1, N + 1):
if A[n] == 0 and visited[n] == False: # CASE 1
in_count = dfs(n)
total += in_count * (in_count - 1)
print(total)