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 |
|
|
| 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 |