[BOJ][๐ŸŸก4][๋ฐฑ์ค€#24955] ์ˆซ์ž ์ด์–ด ๋ถ™์ด๊ธฐ

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #24955


๋ฌธ์ œ

์ฒ ์ˆ˜๋Š” ์ˆ˜๋ฅผ ์ด์–ด ๋ถ™์ด๋Š” ๋†€์ด๋ฅผย ์ข‹์•„ํ•œ๋‹ค. 1๊ณผ 2๋ฅผ ์ด์–ด ๋ถ™์ด๋ฉด 12๊ฐ€ ๋˜๊ณ , 17๊ณผ 13์„ ์ด์–ด ๋ถ™์ด๋ฉด 1713์ด ๋œ๋‹ค. 100๊ณผ 1000์„ ์ด์–ด ๋ถ™์ด๋ฉด 1001000์ด ๋œ๋‹ค. 1๊ณผ 2๋ฅผ ์ด์–ด ๋ถ™์ด๋˜, ์ˆœ์„œ๋ฅผ ๋ฐ˜๋Œ€๋กœ ํ•ด์„œ 2์™€ 1์„ ์ด์–ด ๋ถ™์ด๋ฉด, 21์ด ๋œ๋‹ค. ๊ฐ™์€ ๋‘ ์ˆ˜๋ฅผ ์ด์–ด ๋ถ™์ด๋”๋ผ๋„, ์ด์–ด ๋ถ™์ด๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ ๊ฐ’์ด ๋‹ฌ๋ผ์ง„๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฒ ์ˆ˜๊ฐ€ ์‚ด๊ณ  ์žˆ๋Š” ๋งˆ์„์—๋Š”ย ์ง‘์ด ์—ฌ๋Ÿฌ ์ฑ„ ์žˆ๊ณ , ๊ฐ ์ง‘์—๋Š” $1$๋ถ€ํ„ฐ $N$๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด์žˆ๋‹ค. ๋‘ ์ง‘ ์‚ฌ์ด์— ์กด์žฌํ•˜๋Š” ๋„๋กœ๋ฅผ ํ†ตํ•ด ์„œ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด $N-1$๊ฐœ์˜ ๋„๋กœ๊ฐ€ ์กด์žฌํ•œ๋‹ค. $i$๋ฒˆ์งธ ๋„๋กœ๋Š” $a_i$๋ฒˆ ์ง‘๊ณผ $b_i$์ง‘์„ ์ž‡๋Š”๋‹ค.ย ์ง‘๊ณผ ๋„๋กœ๋Š” ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ๋ฅผ ์ด๋ฃฌ๋‹ค. ์ฆ‰, ์–ด๋–ค ์ง‘์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋ช‡ ๊ฐœ์˜ ๋„๋กœ๋ฅผ ๊ฑฐ์ณ ์–ด๋–ค ์ง‘์ด๋ผ๋„ ๊ฐˆ ์ˆ˜ ์žˆ๊ณ , ๊ฐ™์€ ์ง‘์„ ๋‘ ๋ฒˆ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ทธ ๊ฒฝ๋กœ๋Š” ์œ ์ผํ•˜๋‹ค. ๊ฐ๊ฐ์˜ ์ง‘์˜ ๋Œ€๋ฌธ์—๋Š” ์ˆ˜๊ฐ€ ์“ฐ์—ฌ์žˆ๋‹ค. ์ฒ ์ˆ˜๋Š” ์ด $Q$๋ฒˆ ์ˆ˜๋ฅผ ์ด์–ด ๋ถ™์ด๋Š” ๋†€์ด๋ฅผ ํ•  ๊ฒƒ์ด๋‹ค. $i$๋ฒˆ์งธ ๋†€์ด์—์„œ๋Š” $x_i$๋ฒˆ์งธ ์ง‘์—์„œ ์‹œ์ž‘ํ•ด์„œ, $y_i$๋ฒˆ์งธ ์ง‘๊นŒ์ง€ ์ด๋™ํ•˜๋ฉด์„œ, ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ ์ƒ์— ์žˆ๋Š” ์ง‘๋“ค์˜ ๋Œ€๋ฌธ์— ์“ฐ์—ฌ์žˆ๋Š”ย ์ˆ˜๋“ค์„ ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ด์–ด ๋ถ™์ผ ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ $x_i = y_i$๋ผ๋ฉด, $x_i$๋ฒˆ์งธ ์ง‘์˜ ๋Œ€๋ฌธ์— ์“ฐ์ธ ์ˆ˜๊ฐ€ ๋‹ต์ด ๋  ๊ฒƒ์ด๋‹ค. ์ฒ ์ˆ˜๋Š” ๋†€์ด๊ฐ€ ๋๋‚  ๋•Œ๋งˆ๋‹ค, ์ž๊ธฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜๋“ค์„ ์ด์–ด ๋ถ™์˜€๋Š”์ง€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค. ์ฒ ์ˆ˜๋ฅผ ์œ„ํ•ด, $i$๋ฒˆ์งธ ๋†€์ด๊ฐ€ ๋๋‚ฌ์„ ๋•Œ ์ด์–ด ๋ถ™์ธ ์ˆ˜์˜ ๊ฐ’์„ ๊ตฌํ•ด์ฃผ์ž. ๋‹จ, ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ, $1\,000\,000\,007$๋กœย ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜์ž.


์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ง‘์˜ ๊ฐœ์ˆ˜ $N$๊ณผ, ์ฒ ์ˆ˜๊ฐ€ ๋†€์ด๋ฅผ ํ•  ํšŸ์ˆ˜ $Q$๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” $N$๊ฐœ์˜ ์ง‘์˜ ๋Œ€๋ฌธ์—ย ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜ $A_i$๊ฐ€ ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์„ธ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ $N+1$๋ฒˆ์งธ ์ค„๊นŒ์ง€๋Š”, ๋„๋กœ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. $2+i$๋ฒˆ์งธ ์ค„์—๋Š” $i$๋ฒˆ์งธ ๋„๋กœ๊ฐ€ ์ž‡๋Š” ๋‘ ์ง‘์˜ ๋ฒˆํ˜ธ $a_i, b_i$์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. $N+2$๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ $N+Q+1$๋ฒˆ์งธ ์ค„๊นŒ์ง€๋Š” ๋†€์ด์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. $N+i+1$๋ฒˆ์งธ ์ค„์—๋Š” $i$๋ฒˆ์งธ ๋†€์ด๋ฅผ ์‹œ์ž‘ํ•  ์ง‘์˜ ๋ฒˆํ˜ธ $x_i$์™€, ๋๋‚ผ ์ง‘์˜ ๋ฒˆํ˜ธ $y_i$๊ฐ€ ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค.


์ถœ๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ $Q$๋ฒˆ์งธ ์ค„์— ๊ฑธ์ณ, $i$๋ฒˆ์งธ ์ค„์—๋Š” $i$๋ฒˆ์งธ ๋†€์ด์˜ ๊ฒฐ๊ณผ๋ฅผย $1\,000\,000\,007$๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


์ œํ•œ

$2\leq N \leq 1\,000$ $1\leq Q \leq 1\,000$ $1 \leq A_i \leq 1\,000\,000\,000$ ($1 \leq i \leq N$) $1 \leq a_i, b_i \leq N$ $1 \leq x_i, y_i \leq N$


์˜ˆ์ œ

์ž…๋ ฅ

3 2
10 9 1
1 2
2 3
1 3
3 1


์ถœ๋ ฅ

1091
1910


My Sol

import sys
input = sys.stdin.readline
from collections import deque

def pathcheck(s, e):
    visit = [0]*(V+1)
    Q = deque()
    Q.append((s, [s]))

    while Q:
        u, path = Q.popleft()
        if u == e: return path
        if visit[u]: continue
        visit[u] = 1

        for v in G[u]:
            if visit[v]: continue
            Q.append((v, path+[v]))


V, Q = map(int, input().split())
doors = ['0'] + list(input().split())
G = [[] for _ in range(V+1)]
for _ in range(V-1):
    u, v = map(int, input().split())
    G[u].append(v)
    G[v].append(u)

for _ in range(Q):
    s, e = map(int, input().split())
    path = pathcheck(s, e)
    txt = ''
    for p in path:
        txt += doors[p]
        txt = str(int(txt) % 1000000007)
    print(txt)

BFS๋ฅผ ์ด์šฉํ•ด ๋„์ฐฉ๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ํŒŒ์•…ํ•˜๊ณ , ์ด ๊ฐ๊ฐ์˜ ๋…ธ๋“œ์— ํ•ด๋‹นํ•˜๋Š” ์ˆ˜ ๋ฌธ์ž์—ด์„ ์ด์–ด๋ถ™์ธ ๋’ค, ์ˆซ์ž ๋ณ€ํ™˜ํ•˜์—ฌ 1000000007๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ txt๋กœ ์žฌ์ง€์ •ํ•œ๋‹ค. ์ด๋ฅผ path๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค. ๋งŒ์•ฝ ๋งค๋ฒˆ ์ด ๋‚˜๋ˆ„๋Š” ๊ณผ์ •์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ์ปค์ ธ์„œ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค.

๋งค๋ฒˆ ๋‚˜๋ˆ„์–ด ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ๋’ค์— ์˜ค๋Š” ์ˆ˜ ๋ฌธ์ž์—ด์ด 123์ด๋ผ๊ณ  ํ•  ๋•Œ ์ด์ „ txt์˜ ๊ฐ’์ด X๋ณด๋‹ค ํฐ (X+A)๋ผ๊ณ  ํ•ด๋ณด์ž. ๊ทธ๋ ‡๋‹ค๋ฉด (X+A)123์€ (X*123) + (A*123)์ด๊ณ , X๋ฅผ X๋กœ ๋‚˜๋ˆ„๋ฉด ๋‚˜๋จธ์ง€๋Š” 0์ด๋ฏ€๋กœ A*123์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•˜๋ฉด ๋‘ ์ˆ˜์˜ ๋ฌธ์ž์—ด์„ ๋ถ™์ธ ์–ด๋–ค ๊ฐ’ Y๊ฐ€ X๋ณด๋‹ค ํฌ๋‹ค๋ฉด, X๋ฅผ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋งŒ ๋‚จ๊ฒจ๋„ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!


๋ชจ๋ฒ”๋‹ต์•ˆ

์ถœ์ฒ˜

import sys
from collections import deque

N, Q = map(int, input().split())
num = [""] + input().split()
graph = [[] for _ in range(N + 1)]
for _ in range(N - 1):
    a, b = map(int, next(sys.stdin).split())
    graph[a].append(b)
    graph[b].append(a)

mod = 1_000_000_007
for line in sys.stdin:
    x, y = map(int, line.split())
    v = [False] * (N + 1)
    v[x] = True
    queue = deque([(x, num[x])])

    while queue:
        c, n = queue.popleft()

        if c == y:
            print(int(n) % mod)
            break

        for adj in graph[c]:
            if not v[adj]:
                v[adj] = True
                queue.append((adj, n + num[adj]))

์—ฐ์‚ฐ์‹œ๊ฐ„์ด 30%๊ฐ€๋Ÿ‰ ๋˜๋Š” ํ’€์ด๋ฅผ ๋ฐœ๊ฒฌํ•ด ํ’€์ด๋ฅผ ๋ถ„์„ํ•ด๋ณด๋ ค ํ•œ๋‹ค. ๊ฒฐ์ •์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ถ€๋ถ„์€, ๋‚˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๋งค๋ฒˆ deque์— ๋„ฃ์–ด์ฃผ๋ฉฐ ๊ฒฝ๋กœ๋ฅผ ํŒŒ์•…ํ•œ ๋’ค, ํ•˜๋‚˜ํ•˜๋‚˜ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋ฉฐ ์ˆ˜๋ฅผ ๋ถ™์—ฌ์ฃผ์—ˆ๋Š”๋ฐ, ์ด ๋ถ„์€ ๊ฒฝ๋กœ ๋Œ€์‹  ๋‚˜๋จธ์ง€๋ฅผ ์ž์ฒด๋ฅผ ๊ตฌํ•ด์„œ ๋ถ™์—ฌ๊ฐ€๋ฉฐ deque์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ์ž‘์€ ํ•œ ๊ฐ€์ง€๊ฐ€ ์—ฐ์‚ฐ ์†๋„์— ๊ทธ๋ ‡๊ฒŒ ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋†€๋ผ์› ๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ