結果
| 問題 | No.1320 Two Type Min Cost Cycle |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-04-02 00:59:50 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,248 bytes |
| コンパイル時間 | 236 ms |
| コンパイル使用メモリ | 82,432 KB |
| 実行使用メモリ | 152,740 KB |
| 最終ジャッジ日時 | 2024-09-24 14:45:32 |
| 合計ジャッジ時間 | 16,649 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 WA * 1 |
| other | AC * 37 WA * 12 RE * 8 |
ソースコード
from collections import deque
from heapq import heappop, heappush
from typing import List, Tuple
INF = int(1e18)
def minCostCycle(n: int, edges: List[Tuple[int, int, int]], directed: bool) -> int:
"""O(V*(V+E)*logV)求最小环权值之和,不存在返回INF."""
res = INF
maxWeight = max(w for *_, w in edges)
res = INF
for i, e1 in enumerate(edges):
from_, to, weight = e1
adjList = [[] for _ in range(n)]
for j, e2 in enumerate(edges):
if i != j:
u, v, w = e2
adjList[u].append((v, w))
if not directed:
adjList[v].append((u, w))
cand = _bfs01(adjList, from_, to) if maxWeight <= 1 else _dijkstra(adjList, from_, to)
res = min(res, weight + cand)
return res
def _bfs01(adjList: List[List[Tuple[int, int]]], start: int, target: int) -> int:
n = len(adjList)
dist = [INF] * n
dist[start] = 0
queue = deque([start])
while queue:
cur = queue.popleft()
if cur == target:
return dist[cur]
for next, weight in adjList[cur]:
cand = dist[cur] + weight
if cand < dist[next]:
dist[next] = cand
if weight == 0:
queue.appendleft(next)
else:
queue.append(next)
return INF
def _dijkstra(adjList: List[List[Tuple[int, int]]], start: int, target: int) -> int:
n = len(adjList)
dist = [INF] * n
dist[start] = 0
pq = [(0, start)]
while pq:
curDist, cur = heappop(pq)
if cur == target:
return curDist
if dist[cur] < curDist:
continue
for next, weight in adjList[cur]:
cand = curDist + weight
if cand < dist[next]:
dist[next] = cand
heappush(pq, (cand, next))
return INF
if __name__ == "__main__":
directed = int(input())
n, m = map(int, input().split())
edges = []
for _ in range(m):
u, v, w = map(int, input().split())
u -= 1
v -= 1
edges.append((u, v, w))
res = minCostCycle(n, edges, directed == 1)
if res == INF:
res = -1
print(res)