結果
| 問題 |
No.848 なかよし旅行
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-06-21 16:22:16 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,290 ms / 2,000 ms |
| コード長 | 1,808 bytes |
| コンパイル時間 | 282 ms |
| コンパイル使用メモリ | 82,560 KB |
| 実行使用メモリ | 140,636 KB |
| 最終ジャッジ日時 | 2024-06-22 22:50:42 |
| 合計ジャッジ時間 | 10,183 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 26 |
ソースコード
from heapq import heappop,heappush
def main0(n,m,p,q,t,abc):
p,q=p-1,q-1
g=[[] for _ in range(n)]
for a,b,c in abc:
a,b=a-1,b-1
g[a].append([b,c])
g[b].append([a,c])
inf=float('inf')
from0=[inf]*n
fromp=[inf]*n
fromq=[inf]*n
from0[0]=0
todo=[[0,0]]
while todo:
d,v=heappop(todo)
if from0[v]<d:continue
for nv,nd in g[v]:
if from0[nv]>d+nd:
from0[nv]=d+nd
heappush(todo,[d+nd,nv])
fromp[p]=0
todo=[[0,p]]
while todo:
d,v=heappop(todo)
if fromp[v]<d:continue
for nv,nd in g[v]:
if fromp[nv]>d+nd:
fromp[nv]=d+nd
heappush(todo,[d+nd,nv])
fromq[q]=0
todo=[[0,q]]
while todo:
d,v=heappop(todo)
if fromq[v]<d:continue
for nv,nd in g[v]:
if fromq[nv]>d+nd:
fromq[nv]=d+nd
heappush(todo,[d+nd,nv])
# 別行動しない0->p->q->0
# vで別行動をはじめる。
# 0->v->p->v->0
# 0->v->q->v->0
# vで別行動をはじめるとする。v->p,q最短距離で向かい、再びvで合流するのが最適か。合流の位置はvが最適とは限らない。
# v->pのパス:[2,2,2], v->q:[2,2]ならqに行った人はvに戻ってきた後pに一歩近づいた方が合流が早くなる。
tmp=from0[p]+fromp[q]+fromq[0]
#print(from0)
#print(fromp)
#print(fromq)
if tmp<=t:return t
ans=-1
for v1 in range(n):
for v2 in range(n):
# v1で別行動してv2で合流する
tmp=from0[v1]
tmp+=max(fromp[v1]+fromp[v2],fromq[v1]+fromq[v2])
tmp+=from0[v2]
if tmp<=t:
ans=max(ans,t-max(fromp[v1]+fromp[v2],fromq[v1]+fromq[v2]))
return ans
if __name__=='__main__':
n,m,p,q,t=map(int,input().split())
abc=[list(map(int,input().split())) for _ in range(m)]
ret0=main0(n,m,p,q,t,abc)
print(ret0)