結果
| 問題 | 
                            No.2910 単体ホモロジー入門
                             | 
                    
| コンテスト | |
| ユーザー | 
                             るこーそー
                         | 
                    
| 提出日時 | 2024-10-11 23:05:21 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 2,037 bytes | 
| コンパイル時間 | 173 ms | 
| コンパイル使用メモリ | 82,048 KB | 
| 実行使用メモリ | 52,864 KB | 
| 最終ジャッジ日時 | 2024-10-11 23:05:24 | 
| 合計ジャッジ時間 | 3,551 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 30 WA * 17 | 
ソースコード
import sys
sys.setrecursionlimit(10**5)
input=sys.stdin.readline
import pypyjit
pypyjit.set_param('max_unroll_recursion=-1')
class SCCGraph:
  #ACLと同じ名前で実装したver.
  def __init__(self,n):
    self.n=n
    self.g=[[] for _ in range(self.n)]
    self.rg=[[] for _ in range(self.n)]
    
  def add_edge(self,u,v):
    self.g[u].append(v)
    self.rg[v].append(u)
  
  def _dfs(self,v,vis,order):
    vis[v]=True
    for nv in self.g[v]:
      if vis[nv]:continue
      self._dfs(nv,vis,order)
    order.append(v)
    return order
  
  def _dfs_stack(self,v,vis,order):
    stack=[(v,False)]
    while stack:
      v,done=stack.pop()
      if done:
        order.append(v)
      else:
        stack.append((v,True))
        vis[v]=True
        for nv in self.g[v]:
          if vis[nv]:continue
          stack.append((nv,False))
    return order
  
  def _rdfs(self,v,vis,group):
    vis[v]=True
    group.append(v)
    for nv in self.rg[v]:
      if vis[nv]:continue
      self._rdfs(nv,vis,group)
    return group
  def _rdfs_stack(self,v,vis,group):
    stack=[v]
    while stack:
      v=stack.pop()
      vis[v]=True
      group.append(v)
      for nv in self.rg[v]:
        if vis[nv]:continue
        stack.append(nv)
    return group
  
  def scc(self,dfs_stack=False,rdfs_stack=False):
    order=[]
    vis=[False]*self.n
    for v in range(self.n):
      if vis[v]:continue
      if dfs_stack:self._dfs_stack(v,vis,order)
      else:self._dfs(v,vis,order)
    order=order[::-1]
    
    groups=[]
    vis=[False]*self.n
    for v in order:
      if vis[v]:continue
      groups.append(self._rdfs_stack(v,vis,[]) if rdfs_stack else self._rdfs(v,vis,[]))
    
    return groups
n,m=map(int,input().split())
scc=SCCGraph(n)
for _ in range(m):
    u,v=map(lambda x:int(x)-1,input().split())
    scc.add_edge(u,v)  
    scc.add_edge(v,u)
V=list(map(lambda x:int(x)-1,input().split()))
V.sort()
groups=scc.scc()
for group in groups:
    group.sort()
    if group==V:
        print('No')
        exit()
print('Yes')
            
            
            
        
            
るこーそー