結果
問題 | No.1813 Magical Stones |
ユーザー |
![]() |
提出日時 | 2022-01-25 03:09:11 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,500 bytes |
コンパイル時間 | 344 ms |
コンパイル使用メモリ | 82,516 KB |
実行使用メモリ | 111,460 KB |
最終ジャッジ日時 | 2024-12-15 08:02:46 |
合計ジャッジ時間 | 13,296 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 WA * 1 |
other | AC * 22 WA * 18 |
ソースコード
N,M=map(int,input().split())# UnionFindGroup = [i for i in range(N+1)] # グループ分けNodes = [1]*(N+1) # 各グループのノードの数def find(x):while Group[x] != x:x=Group[x]return xdef Union(x,y):if find(x) != find(y):if Nodes[find(x)] < Nodes[find(y)]:Nodes[find(y)] += Nodes[find(x)]Nodes[find(x)] = 0Group[find(x)] = find(y)else:Nodes[find(x)] += Nodes[find(y)]Nodes[find(y)] = 0Group[find(y)] = find(x)# (一般グラフの)トポロジカルソート、SCCE=[[] for i in range(N)]E_INV=[[] for i in range(N)]for i in range(M):x,y=map(int,input().split())x-=1y-=1E[x].append(y)E_INV[y].append(x)# DFSして帰り際にTOPに点を放り込んでいる。# NOWで現在地点、USEINDで、どこの辺まで既に見たか、を調べている。def Top_sort(E):Parent=[-1]*NUSEIND=[0]*NTOP=[]for ROOT in range(N):if Parent[ROOT]!=-1:continueParent[ROOT]=ROOTNOW=ROOTwhile NOW!=ROOT or USEIND[ROOT]!=len(E[ROOT]):if USEIND[NOW]==len(E[NOW]):TOP.append(NOW)NOW=Parent[NOW]elif E[NOW][USEIND[NOW]]==Parent[NOW]:USEIND[NOW]+=1else:NEXT=E[NOW][USEIND[NOW]]USEIND[NOW]+=1if Parent[NEXT]==-1:Parent[NEXT]=NOWNOW=NEXTTOP.append(ROOT)return TOP[::-1]USE=[0]*NSCC=[]# SCCを調べるための逆順DFS。# やっていることはhttps://manabitimes.jp/math/1250 などと同じ。def dfs2(x):Q=[x]USE[x]=1ANS=[]while Q:x=Q.pop()ANS.append(x)for to in E_INV[x]:if USE[to]==0:USE[to]=1Q.append(to)return ANSTOP_SORT=Top_sort(E)for x in TOP_SORT:if USE[x]==0:SCC.append(dfs2(x))for i in range(len(SCC)):for j in range(len(SCC[i])-1):Union(SCC[i][j],SCC[i][j+1])IN=[0]*NOUT=[0]*Nfor i in range(N):for to in E[i]:if find(i)==find(to):continueOUT[find(i)]+=1IN[find(i)]+=1ANS=0ANS2=0for i in range(N):if find(i)==i:if OUT[i]==0:ANS+=1if IN[i]==0:ANS2+=1print(max(ANS,ANS2))