Cod sursa(job #2660786)
Utilizator | Data | 20 octombrie 2020 15:40:27 | |
---|---|---|---|
Problema | Distante | Scor | 30 |
Compilator | py | Status | done |
Runda | Arhiva de probleme | Marime | 3.88 kb |
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
def main():
''' https://infoarena.ro/problema/distante '''
i, o = "distante.in", "distante.out"
with open(i, buffering = 2<<16) as f, open(o, "w") as g:
line = (line for line in f)
T = int(next(line))
for _ in range(T):
N, M, S = map(int, next(line).split())
S = S - 1
A = [list() for _ in range(N)]
D = list(map(int, next(line).split()))
for _ in range(M):
a, b, c = map(int, next(line).split())
a, b = a - 1, b - 1
A[a].append((b, c))
A[b].append((a, c))
ok = verify_distances(A, D, S)
g.write("DA\n" if ok else "NU\n")
return 0
def verify_distances(adjacency_lists, distances, start_vertex):
""" Dijstra's algorithm's certificate validation algorithm. """
if distances[start_vertex] != 0:
return False
n = len(adjacency_lists)
mark = [False for u in range(n)]
for u in range(n):
d_u = distances[u]
for e in adjacency_lists[u]:
v, w_uv = e
d_v = distances[v]
a_v = d_u + w_uv
if a_v < d_v:
return False
if a_v == d_v:
mark[v] = True
mark[start_vertex] = True
return all(mark)
if __name__ == "__main__":
status_code = main()
sys.exit(status_code)