Submission #71556268


Source Code Expand

'''
方針: 逆向きのグラフ & BFS

例: 
1->2->3->4->5->6->7->8->9->10
4を黒く塗った場合、1,2,3,4が黒に到達可

メモ:
ある頂点を黒く塗った場合、そこへの辺が存在する頂点を求める 
-> 全て入力と逆向きの辺を追加したグラフで考えればよい(例では1<-2<-3<-4...<-9 というグラフを考えればよい)

1: 逆向きの有向辺を加える
2: 各クエリを実行する
 クエリ1: 頂点からBFS(ただし、すでに黒い点が現れたらそこで探索終了 -> 各頂点は高々1回程度の訪問)
 クエリ2: 頂点が黒へ到達可能か調べて解答

==== 
TLEの理由: 開始点がすでに黒の場合もBFSを開始している
-> 例えば、点1から10**5個の点への辺(逆向きの有向辺)があるケースで、クエリ「1 1」が10**5回きたら、各クエリ度に、頂点1の隣接頂点の訪問をしてしまう(10**5回)
-> 修正点: vがすでに黒に到達可能ならBFSしない
'''
from collections import deque
# BFS
def bfs(start, edges, visited):
  points = deque([start])
  visited[start] = True
  #reachable_black[start] = True
  while(len(points) > 0):
    p = points.popleft()
    # 隣接頂点を調べる
    for next_p in edges[p]:
      # 未訪問のみ調べる
      if(not visited[next_p]):
        visited[next_p] = True
        #reachable_black[next_p] = True
        points.append(next_p)
  return visited

# 入力
N,M = list(map(int, input().split()))
edges = [[] for _ in range(N+1)] # defaultdict->listに変更
for i in range(M):
  x,y = list(map(int, input().split()))
  edges[y].append(x) # 有向辺y->xの追加

# クエリ
Q = int(input())
visited = [False]*(N+1) # defaultdict->listに変更
#reachable_black = defaultdict(lambda:False) # わざわざvisitedと2つに分けることもなかった気がする
for i in range(Q):
  query_no,v = list(map(int, input().split()))
  # 黒へ到達可能な頂点を更新
  if(query_no == 1):
    # 黒へ到達可能な頂点の場合は探索skip
    if(visited[v]):
      continue
    visited = bfs(start=v, edges=edges, visited=visited)
  # 黒へ到達可能か(=BFSで訪問済みか)  
  elif(query_no == 2):
    if(visited[v]):
      print("Yes")
    else:
      print("No")

Submission Info

Submission Time
Task D - Reachability Query 2
User hiro716
Language Python (PyPy 3.11-v7.3.20)
Score 425
Code Size 2355 Byte
Status AC
Exec Time 1235 ms
Memory 146536 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 425 / 425
Status
AC × 1
AC × 30
Set Name Test Cases
Sample sample_01.txt
All min.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, random_28.txt, sample_01.txt
Case Name Status Exec Time Memory
min.txt AC 72 ms 93868 KiB
random_01.txt AC 1189 ms 138600 KiB
random_02.txt AC 1196 ms 138204 KiB
random_03.txt AC 943 ms 119096 KiB
random_04.txt AC 1098 ms 121296 KiB
random_05.txt AC 753 ms 110876 KiB
random_06.txt AC 716 ms 110900 KiB
random_07.txt AC 871 ms 113540 KiB
random_08.txt AC 1227 ms 134036 KiB
random_09.txt AC 718 ms 114988 KiB
random_10.txt AC 744 ms 116720 KiB
random_11.txt AC 923 ms 119020 KiB
random_12.txt AC 1081 ms 136904 KiB
random_13.txt AC 585 ms 116612 KiB
random_14.txt AC 547 ms 113072 KiB
random_15.txt AC 748 ms 123564 KiB
random_16.txt AC 805 ms 122732 KiB
random_17.txt AC 1038 ms 142032 KiB
random_18.txt AC 1143 ms 146192 KiB
random_19.txt AC 727 ms 110704 KiB
random_20.txt AC 828 ms 113248 KiB
random_21.txt AC 1166 ms 134912 KiB
random_22.txt AC 1161 ms 146192 KiB
random_23.txt AC 1114 ms 141204 KiB
random_24.txt AC 1128 ms 146536 KiB
random_25.txt AC 1213 ms 145692 KiB
random_26.txt AC 1235 ms 146012 KiB
random_27.txt AC 1046 ms 146188 KiB
random_28.txt AC 885 ms 141792 KiB
sample_01.txt AC 73 ms 93912 KiB