結果
| 問題 | No.1301 Strange Graph Shortest Path | 
| コンテスト | |
| ユーザー |  titia | 
| 提出日時 | 2020-11-28 16:13:53 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 1,462 ms / 3,000 ms | 
| コード長 | 1,670 bytes | 
| コンパイル時間 | 209 ms | 
| コンパイル使用メモリ | 82,076 KB | 
| 実行使用メモリ | 239,104 KB | 
| 最終ジャッジ日時 | 2024-09-12 23:07:21 | 
| 合計ジャッジ時間 | 42,378 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 33 | 
ソースコード
import sys
input = sys.stdin.readline
import heapq
N,M=map(int,input().split())
EDGE=[[] for i in range(N+1)]
EDGELIST=[]
eind=0
for i in range(M):
    u,v,c,d=map(int,input().split())
    X=[v,c,1,eind]
    EDGE[u].append(X)
    EDGELIST.append(X)
    eind+=1
    X=[u,-c,0,eind]
    EDGE[v].append(X)
    EDGELIST.append(X)
    eind+=1
    X=[u,c,1,eind]
    EDGE[v].append(X)
    EDGELIST.append(X)
    eind+=1
    X=[v,-c,0,eind]
    EDGE[u].append(X)
    EDGELIST.append(X)
    eind+=1
    X=[v,d,1,eind]
    EDGE[u].append(X)
    EDGELIST.append(X)
    eind+=1
    X=[u,-d,0,eind]
    EDGE[v].append(X)
    EDGELIST.append(X)
    eind+=1
    X=[u,d,1,eind]
    EDGE[v].append(X)
    EDGELIST.append(X)
    eind+=1
    X=[v,-d,0,eind]
    EDGE[u].append(X)
    EDGELIST.append(X)
    eind+=1
start=1
goal=N
BACK=[[-1,-1] for i in range(N+1)]
P=[0]*(N+1)
LA=0
for fl in range(2):
    ANS=[float("inf")]*(N+1)
    Q=[start]
    ANS[start]=0
    while Q:
        x = heapq.heappop(Q)
        time = x>>20
        fr = x - (time<<20)
        if time > ANS[fr]:
            continue
        for to,cost,vol,ind in EDGE[fr]:
            
            if vol>0 and ANS[to]>ANS[fr]+cost:
                
                ANS[to]=ANS[fr]+cost
                BACK[to]=[fr,ind]
                heapq.heappush(Q,((ANS[to])<<20)+to)
    LA+=ANS[goal]+P[goal]
    P=[P[i]+ANS[i] for i in range(N+1)]
 
    NOW=goal
    while NOW!=start:
        fr,ind=BACK[NOW]
        EDGELIST[ind][2]-=1
        EDGELIST[ind^1][2]+=1
        NOW=fr
    for i in range(N+1):
        for j in range(len(EDGE[i])):
            EDGE[i][j][1]+=P[i]-P[EDGE[i][j][0]]
print(LA)
            
            
            
        