https://www.acmicpc.net/problem/27617
최단경로가 되는 경로를 모두 저장하고 전체 경로에서 최단경로에 포함 안 되는 것들을 찾으면 된다.
import heapq
def dijkstra(start, n, gra):
dp = [float('inf')] * (n + 1)
dp[start] = 0
heap = [(0, start)]
parent = [[] for _ in range(n + 1)]
while heap:
wei, now = heapq.heappop(heap)
if dp[now] < wei: continue
for node, cost in gra[now]:
next_wei = cost + wei
if next_wei < dp[node]:
dp[node] = next_wei
parent[node] = [now]
heapq.heappush(heap, (next_wei, node))
elif next_wei == dp[node]:
parent[node].append(now)
return dp, parent
def find_paved_roads(node, parent, visited):
paved = set()
def dfs(v):
for u in parent[v]:
if (min(u, v), max(u, v)) not in visited:
# print(u,v )
visited.add((min(u, v), max(u, v)))
paved.add((min(u, v), max(u, v)))
dfs(u)
dfs(node)
return paved
def main():
n, m, a, b = map(int, input().split())
gra = [[] for _ in range(n + 1)]
total = 0
roads = []
for _ in range(m):
i1, i2, l = map(int, input().split())
gra[i1].append((i2, l))
gra[i2].append((i1, l))
roads.append((min(i1, i2), max(i1, i2), l))
total += l
dp, parent = dijkstra(a, n, gra)
# print(dp)
# print(parent)
visited = set()
paved_roads = find_paved_roads(b, parent, visited)
unnecessary_road_length = 0
for i1, i2, l in roads:
if (i1, i2) not in paved_roads:
unnecessary_road_length += l
print(unnecessary_road_length)
if __name__ == "__main__":
main()
'알고리즘 문제풀이' 카테고리의 다른 글
강의실[백준 1374] (0) | 2024.09.11 |
---|---|
Heat Wave[백준 5996] (0) | 2024.09.11 |
안정적인 문자열[백준 4889] (0) | 2024.07.22 |
치킨 TOP N [백준 11582] (0) | 2024.07.21 |
줄 세우기 [백준 11536] (0) | 2024.07.19 |