結果

問題 No.2464 To DAG
ユーザー fiblonariafiblonaria
提出日時 2023-09-21 13:53:40
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,041 bytes
コンパイル時間 289 ms
コンパイル使用メモリ 81,792 KB
実行使用メモリ 299,480 KB
最終ジャッジ日時 2024-07-07 07:37:17
合計ジャッジ時間 39,101 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 36 ms
52,224 KB
testcase_01 WA -
testcase_02 AC 1,462 ms
299,480 KB
testcase_03 AC 1,204 ms
217,148 KB
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 AC 578 ms
114,152 KB
testcase_13 WA -
testcase_14 WA -
testcase_15 AC 1,050 ms
216,996 KB
testcase_16 AC 626 ms
156,908 KB
testcase_17 AC 146 ms
86,144 KB
testcase_18 AC 364 ms
132,096 KB
testcase_19 AC 37 ms
52,096 KB
testcase_20 AC 37 ms
51,840 KB
testcase_21 AC 37 ms
52,096 KB
testcase_22 WA -
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 AC 314 ms
108,032 KB
testcase_27 AC 1,199 ms
247,068 KB
testcase_28 AC 1,234 ms
226,932 KB
testcase_29 WA -
testcase_30 WA -
testcase_31 WA -
testcase_32 WA -
testcase_33 AC 1,133 ms
233,272 KB
testcase_34 AC 647 ms
155,944 KB
testcase_35 WA -
testcase_36 WA -
testcase_37 WA -
testcase_38 WA -
testcase_39 AC 101 ms
120,320 KB
testcase_40 AC 117 ms
120,320 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

def choice(s):
	ret = s.pop()
	s.add(ret)
	return ret
def remove_edge(f, t, succ, pred, zero):
	succ[f].discard(t)
	pred[t].discard(f)
	if len(succ[f]) == 0:
		zero.append(f)
N, M = map(int, input().split())
succ = [set() for i in range(N)]
pred = [set() for i in range(N)]
zero = []
zero_p = 0
start = 0
ans = []
for i in range(M):
	f, t = map(int, input().split())
	succ[f - 1].add(t - 1)
	pred[t - 1].add(f - 1)
for i in range(N):
	if len(succ[i]) == 0:
		zero.append(i)
while 1:
	while len(zero) > zero_p:
		t = zero[zero_p]
		while len(pred[t]) > 0:
			f = pred[t].pop()
			ans.append((f, t))
			remove_edge(f, t, succ, pred, zero)
		zero_p += 1
	if zero_p == N:
		break
	while len(succ[start]) == 0:
		start = (start + 1) % N
	path = [start]
	path_s = set(path)
	while 1:
		nex = choice(succ[path[-1]])
		path.append(nex)
		if nex in path_s:
			break
		path_s.add(nex)
	for i in range(path.index(nex), len(path) - 1):
		remove_edge(path[i], path[i + 1], succ, pred, zero)
print(N, len(ans))
for i in ans:
	print(i[0] + 1, i[1] + 1)
	
	
0