diff --git a/18-03-24/d.py b/18-03-24/d.py new file mode 100644 index 0000000..5289c19 --- /dev/null +++ b/18-03-24/d.py @@ -0,0 +1,54 @@ +def main(): + n, m, k = map(int, input().split()) + a = [int(i) for i in input().split()] + # roads = [list(map(int, input().split())) for _ in range(m)] + + voisins = {i:set() for i in range(1, n+1)} + + A = set(a) # pour les test d'appartenance + special = False + for _ in range(m): + x, y = map(int, input().split()) + voisins[x].add(y) + voisins[y].add(x) + if not special and (x in A and y in A): + special = True + + + def distance(source, dist): + """calculer la distance d'un sommet à tous les autres""" + non_vus = set((i+1 for i in range(n) if i+1 != source)) + queue = [source] + dist[source] = 0 + while queue != []: + nextQ = [] + while queue != []: + s = queue.pop() + for v in voisins[s]: + if v in non_vus: + non_vus.remove(v) + nextQ.append(v) + dist[v] = dist[s]+1 + queue = nextQ + + dist_n = [0 for _ in range(n+1)] + dist_1 = [0 for _ in range(n+1)] + distance(n, dist_n) + distance(1, dist_1) + + if special: + return dist_n[1] # On ne rajoute rien + + # On regarde lequel ajouter + a.sort(key=lambda x: dist_1[x]-dist_n[x]) + sp_count = len(a) + b = [dist_n[a[-1]] for i in range(sp_count)] + for sp in range(1, sp_count): + b[sp_count-1-sp] = max(b[sp_count-sp], dist_n[a[sp_count-sp]]) + + return min( + dist_1[n], + max((dist_1[a[i]]+b[i] for i in range(0, len(a)-1)))+1 + ) + +print(main()) \ No newline at end of file