結果
| 問題 |
No.2565 はじめてのおつかい
|
| コンテスト | |
| ユーザー |
👑 Kazun
|
| 提出日時 | 2024-01-21 12:07:22 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,016 ms / 2,000 ms |
| コード長 | 7,464 bytes |
| コンパイル時間 | 298 ms |
| コンパイル使用メモリ | 82,704 KB |
| 実行使用メモリ | 303,084 KB |
| 最終ジャッジ日時 | 2024-09-28 06:14:10 |
| 合計ジャッジ時間 | 25,299 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 50 |
ソースコード
class Digraph:
"""重み[なし]有向グラフを生成する.
"""
#入力定義
def __init__(self, N=0):
""" N 頂点の空グラフを生成する. """
self.arc_number=0
self.adjacent_out=[set() for v in range(N)]#出近傍(vが始点)
self.adjacent_in=[set() for v in range(N)] #入近傍(vが終点)
#頂点の追加
def add_vertex(self):
""" 頂点を追加する.
"""
self.adjacent_out.append(set())
self.adjacent_in.append(set())
return self.order()-1
def add_vertices(self, k=1):
""" 頂点を k 個追加する.
k: int
"""
n=self.order()
self.adjacent_out.extend([set() for _ in range(k)])
self.adjacent_in.extend([set() for _ in range(k)])
return list(range(n,n+k))
#辺の追加
def add_arc(self, source, target, mode=0):
if target not in self.adjacent_out[source]:
self.adjacent_out[source].add(target)
self.adjacent_in[target].add(source)
self.arc_number+=1
if mode:
return self.arc_number-1
else:
if mode:
return -1
#辺を除く
def remove_arc(self, source, target):
if target in self.adjacent_out[source]:
self.adjacent_out[source].discard(target)
self.adjacent_in[target].discard(source)
self.arc_number-=1
def reset_vertex(self, u):
""" 頂点 u に接続している辺を全て消す."""
X=self.adjacent_out[u].copy()
for v in X:
self.remove_arc(u,v)
X=self.adjacent_in[u].copy()
for w in X:
self.remove_arc(w,u)
#Walkの追加
def add_walk(self,*walk):
""" 有向歩道 walk=(w[0], ..., w[n-1]) を追加する. """
N=len(walk)
for k in range(N-1):
self.add_arc(walk[k],walk[k+1])
#Cycleの追加
def add_cycle(self,*cycle):
""" 有向サイクル cycle=(c[0] ..., c[n-1]) を追加する. """
self.add_walk(*cycle)
self.add_arc(cycle[-1],cycle[0])
#グラフに辺が存在するか否か
def arc_exist(self, u, v):
""" 有向辺 u -> v は存在するか? """
return (v in self.adjacent_out[u])
#近傍
def neighbohood(self,v):
"""vの出近傍, 入近傍を出力する.
Input:
v:頂点
Output:
(出近傍, 入近傍)
"""
return (self.adjacent_out[v],self.adjacent_in[v])
#出次数
def out_degree(self,v):
return len(self.adjacent_out[v])
#入次数
def in_degree(self,v):
return len(self.adjacent_in[v])
#次数
def degree(self,v):
return (self.out_degree(v),self.in_degree(v))
#相対次数
def relative_degree(self,v):
return self.out_degree(v)-self.in_degree(v)
#頂点数
def vertex_count(self):
""" グラフの頂点数 (位数) を求める."""
return len(self.adjacent_out)
def order(self):
""" グラフの位数 (頂点数) を求める."""
return len(self.adjacent_out)
#辺数
def arc_count(self):
""" グラフの辺数 (サイズ) を求める."""
return self.arc_number
def size(self):
""" グラフのサイズ (辺数) を求める. """
return self.arc_number
#頂点vに到達可能な頂点
def reachable_to(self,v):
""" 頂点 v に到達可能な頂点を求める. """
from collections import deque
N=self.vertex_count()
T=[0]*N; T[v]=1
Q=deque([v])
while Q:
x=Q.pop()
for y in self.adjacent_in[x]:
if not T[y]:
T[y]=1
Q.append(y)
return [x for x in range(N) if T[x]]
#頂点vから到達可能な頂点
def reachable_from(self,v):
""" 頂点 v へ到達可能な頂点を求める. """
from collections import deque
N=self.vertex_count()
T=[0]*N; T[v]=1
Q=deque([v])
while Q:
x=Q.pop()
for y in self.adjacent_out[x]:
if not T[y]:
T[y]=1
Q.append(y)
return [x for x in range(N) if T[x]]
#頂点 u,v の距離を求める.
def distance(self,u,v):
if u==v:
return 0
from collections import deque
inf=float("inf")
N=self.vertex_count()
adj_out=self.adjacent_out
T=[inf]*N; T[u]=0
Q=deque([u])
while Q:
w=Q.popleft()
for x in adj_out[w]:
if T[x]==inf:
T[x]=T[w]+1
Q.append(x)
if x==v:
return T[x]
return inf
#ある1点からの距離
def distance_all(self,u):
""" 頂点 u からの距離を求める."""
from collections import deque
inf=float("inf")
adj_out=self.adjacent_out
T=[inf]*self.vertex_count(); T[u]=0
Q=deque([u])
while Q:
w=Q.popleft()
for x in adj_out[w]:
if T[x]==inf:
T[x]=T[w]+1
Q.append(x)
return T
def shortest_path(self,u,v, dist=False):
""" u から v への最短路を求める (存在しない場合は None).
dist: False → shortest_path のみ, True → (dist, shortest_path)"""
if u==v:
if dist:
return (0,[u])
else:
return [u]
from collections import deque
inf=float("inf")
adj_in=self.adjacent_in
T=[-1]*self.vertex_count()
Q=deque([v]); T[v]=v
while Q:
w=Q.popleft()
for x in adj_in[w]:
if T[x]==-1:
T[x]=w
Q.append(x)
if x==u:
P=[u]
a=u
while a!=v:
a=T[a]
P.append(a)
if dist:
return (len(P)-1,P)
else:
return P
if dist:
return (inf,None)
else:
return None
#深いコピー
def deepcopy(self):
from copy import deepcopy
D=Digraph(self.vertex_count())
D.arc_number=self.arc_count()
D.adjacent_out=deepcopy(self.adjacent_out)
D.adjacent_in=deepcopy(self.adjacent_in)
return D
#==================================================
def solve():
N, M = map(int, input().split())
def encode(x, p, q):
return (2 * p + q) * N + (x - 1)
D = Digraph(4 * N)
for j in range(M):
u, v = map(int, input().split())
if v == N - 1:
a, b = 1, 0
elif v == N:
a, b = 0, 1
else:
a, b = 0, 0
for p, q in [(0, 0), (0, 1), (1, 0), (1, 1)]:
D.add_arc(encode(u, p, q), encode(v, p | a, q | b))
dist = D.distance(encode(1, 0, 0), encode(1, 1, 1))
return dist if dist < float('inf') else -1
#==================================================
import sys
input=sys.stdin.readline
write=sys.stdout.write
print(solve())
Kazun