結果
| 問題 |
No.1473 おでぶなおばけさん
|
| コンテスト | |
| ユーザー |
harurun
|
| 提出日時 | 2021-04-10 00:23:56 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 1,421 ms / 2,000 ms |
| コード長 | 3,317 bytes |
| コンパイル時間 | 279 ms |
| コンパイル使用メモリ | 13,184 KB |
| 実行使用メモリ | 70,252 KB |
| 最終ジャッジ日時 | 2024-06-25 13:10:02 |
| 合計ジャッジ時間 | 33,274 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 47 |
ソースコード
class dsu:
def __init__(self,n):
assert n>0,"n must be Natural"
self.n=n
self.parents=[-1]*n
return
def find(self,x):
assert x<self.n,"warning!! this is 0 index"
if self.parents[x]<0:
return x
self.parents[x]=self.find(self.parents[x])
return self.parents[x]
def merge(self,x,y):
assert x<self.n and y<self.n,"warning!! this is 0 index"
x=self.find(x)
y=self.find(y)
if x==y:
return
if self.parents[x]>self.parents[y]:
x,y=y,x
self.parents[x]+=self.parents[y]
self.parents[y]=x
return
def size(self,x):
assert x<self.n,"warning!! this is 0 index"
return -self.parents[self.find(x)]
def same(self,x,y):
assert x<self.n and y<self.n,"warning!! this is 0 index"
return self.find(x)==self.find(y)
def leader(self,x):
assert x<self.n,"warning!! this is 0 index"
if self.parents[x]<0:
return x
self.parents[x]=self.leader(self.parents[x])
return self.parents[x]
def groups(self):
ld=[self.leader(i) for i in range(self.n)]
res=[[] for _ in range(self.n)]
for i in range(self.n):
res[ld[i]].append(i)
return list(filter(lambda a:a !=[],res))
from heapq import heapify,heappop,heappush
INF=1000000000000000000
V=0
G=[[] for _ in [0]*100000]
d=[INF]*100000
def dijkstra(s):
que=[]
heapify(que)
d[s]=0
heappush(que,[0,s])
while que:
p=heappop(que)
v=p[1]
if d[v]<p[0]:
continue
for i in range(len(G[v])):
e=G[v][i]
if d[e[0]]>d[v]+e[1]:
d[e[0]]=d[v]+e[1]
heappush(que,[d[e[0]],e[0]])
"""
G[from].append([to,value])で追加
"""
class INPUT:
def __init__(self):
self.l=open(0).read().split()[::-1]
self.length=len(self.l)
return
def stream(self,k=1,f=int,f2=False):
assert(-1<k)
m=self.length
if m==0 or m<k:
raise Exception("There is no input!")
elif f!=str:
if k==0:
self.length=0
return list(map(f,self.l[::-1]))
if k==1 and not f2:
self.length-=1
return f(self.l.pop())
if k==1 and f2:
self.length-=1
return [f(self.l.pop())]
ret=[]
for _ in [0]*k:
ret.append(f(self.l.pop()))
self.length-=k
return ret
else:
if k==0:
self.length=0
return self.l[::-1]
if k==1 and not f2:
self.length-=1
return self.l.pop()
if k==1 and f2:
self.length-=1
return [self.l.pop()]
ret=[]
for _ in [0]*k:
ret.append(self.l.pop())
self.length-=k
return ret
pin=INPUT().stream
"""
pin(number[default:1],f[default:int],f2[default:False])
if number==0 -> return left all
listを変数で受け取るとき、必ずlistをTrueにすること。
"""
def main():
n,m=pin(2)
uf=dsu(n)
ds=[pin(3)for i in range(m)]
ds=sorted(ds,key=lambda x:x[2],reverse=True)
w=float("inf")
j=m-1
for i in range(m):
w=min(w,ds[i][2])
uf.merge(ds[i][0]-1,ds[i][1]-1)
G[ds[i][0]-1].append([ds[i][1]-1,1])
G[ds[i][1]-1].append([ds[i][0]-1,1])
if uf.same(0,n-1):
j=i+1
break
while j<m and w==ds[j][2]:
G[ds[j][0]-1].append([ds[j][1]-1,1])
G[ds[j][1]-1].append([ds[j][0]-1,1])
j+=1
dijkstra(0)
print(w,d[n-1])
return
main()
harurun