Cod sursa(job #2660786)

Utilizator mgntMarius B mgnt 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)