-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1108 검색엔진.py
More file actions
69 lines (61 loc) · 1.44 KB
/
1108 검색엔진.py
File metadata and controls
69 lines (61 loc) · 1.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import sys
sys.setrecursionlimit(10 ** 9)
def dfs1(n):
visited[n] = True
for v in forward[n]:
if not visited[v]:
dfs1(v)
stack.append(n)
def dfs2(n):
visited[n] = idx
for i in range(len(backward[n]) - 1, -1, -1):
v = backward[n][i]
if visited[v] == -1:
forward[v].remove(n)
dfs2(v)
elif visited[v] == idx:
forward[v].remove(n)
tmp.append(n)
def dfs(n):
for v in forward[n]:
if dp[v] == 1:
dp[n] += dfs(v)
else:
dp[n] += dp[v]
return dp[n]
N = int(sys.stdin.readline())
forward = [[] for _ in range(N)]
backward = [[] for _ in range(N)]
data = [sys.stdin.readline().split() for _ in range(N)]
alpha = dict()
idx = N
for i in range(N):
alpha[data[i][0]] = i
for i in range(N):
for j in range(2, len(data[i])):
if data[i][j] not in alpha:
alpha[data[i][j]] = idx
idx += 1
forward.append([])
backward.append([])
forward[i].append(alpha[data[i][j]])
backward[alpha[data[i][j]]].append(i)
N = idx
visited = [False] * N
stack = []
for i in range(N):
if not visited[i]:
dfs1(i)
visited = [-1] * N
idx = 0
ans = []
target = alpha[sys.stdin.readline().rstrip()]
while stack:
cur = stack.pop()
if visited[cur] == -1:
tmp = []
dfs2(cur)
ans.append(tmp)
idx += 1
dp = [1] * N
print(dfs(target))